我该如何在Perl的一行命令中调用一个模块?

9

假设我有一个数据文件需要处理;我想要取出每列的最大值,并将其添加到每一行的末尾。

输入:

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 中没有一个合适的例子说明如何做到这一点(实际上有,我的文档读起来有些困难)。
4个回答

23
您加载了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文档解释道:

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


1
甜。 s///e 技巧是一个不错的技巧。只需要确保它适用于行内编辑即可。 - Zaid
1
是的。我修改了它,还包括一个新的标题:perl -i.bak -MList::Util=max -ape 's/$/" " .($.===1 ? "TMAX" : max(@F))/e' input - Zaid

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

2

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接