如何在Perl单行中调用模块?

时间:2010-04-08 13:39:22

标签: perl module

说我有一个我想要处理的数据文件;我想取每列的最大值并将其附加到每一行的末尾。

INPUT:

T1 T2 T3
35.82 34.67 31.68
32.20 34.52 33.59
37.41 38.64 37.56

输出:

T1 T2 T3
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64

我正试图将其作为一个单行程来实现。到目前为止,这是我提出的,虽然它抱怨&main::max未定义:

perl -MList::Util -ani.bak -e "print qq(@F).q( ).max(@F).qq(\n)" file1.txt

似乎我没有加载List::Util模块。怎么了?标题栏是一个问题吗?

perlrun没有关于如何执行此操作的正确示例实际上它确实如此,我的文档有点难以阅读)。< / p>

4 个答案:

答案 0 :(得分:20)

您加载了List::Util,但默认情况下模块不会导出符号。通过检查$.是否为1来跳过标题行。

$ perl -MList::Util=max -ape 's/$/" " . max(@F)/e unless $.==1' input 
T1 T2 T3
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64

perlrun文档说明:

  

一点点内置语法糖意味着你也可以说 -module = foo,bar -Mmodule = foo,bar 作为-Mmodule qw(foo bar)的快捷方式。这避免了在导入符号时使用引号的需要。 -Mmodule = foo,bar 生成的实际代码为use module split(/,/,q{foo,bar})。请注意,=表单会删除 -m -M 之间的区别。

答案 1 :(得分:4)

perl -M"List::Util 'max'" -ani.bak -e "print qq(@F).q( ).max(@F).qq(\n)" file1.txt

答案 2 :(得分:2)

List :: Util已加载,但默认情况下不导出max函数:

perl -MList::Util -ani.bak -e "print qq(@F).q( ).List::Util::max(@F).qq(\n)" file1.txt

答案 3 :(得分:1)

如果Perl不是必须的,这里是一个awk单行

$ awk '{for(i=1;i<=NF;i++)if($i>t){t=$i};print $0,t;t=0}' file
35.82 34.67 31.68 35.82
32.20 34.52 33.59 34.52
37.41 38.64 37.56 38.64