2009年5月9日星期六

[PerlChina] Re: 请教合并一文件中域1相同的记录,域2进行累加

~$ cat data.txt
1|2
1|3
2|3
3|3
4|3

~$ perl -F'\|' -MData::Dumper -ane '$h->{$F[0]}+=$F[1];END{print Dumper $h}' data.txt
$VAR1 = {
          '4' => 3,
          '1' => 5,
          '3' => 3,
          '2' => 3
        };


:)

2009/5/9 agentzh <agentzh@gmail.com>
2009/5/9 Anthony WU <anthonywuy2k@gmail.com>

看來用map的人比較少
map ((/^(\d+)\|(\d+)$/, $hash{$1}+= $2), <>);
map (printf ("%d|%d\n", $_, $hash{$_}), keys (%hash));

呃。。。根据 perlstyle 文档,在 void 上下文下使用 map 要尽量避免:

   http://perldoc.perl.org/perlstyle.html

引用相关的一段:

    Avoid using grep() (or map()) or `backticks` in a void context, that is, when you just throw away their return values. Those functions all have return values, so use them. Otherwise use a foreach() loop or the system() function instead.

所以从内存效率上讲,在这里使用 map 是比较不划算的,呵呵,尤其当文件比较大的时候 ;)

Cheers,
-agentzh





--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

没有评论: