Perl one liner中括号内的函数名称

Rom*_*rio 1 perl

我正在研究Perl one liner 教程,有一个这样的衬里:

ls -lAF | perl -e 'while (<>) {next if /^[dt]/; print +(split)[8] . " size: " . +(split)[4] . "\n"}'
Run Code Online (Sandbox Code Playgroud)

您看到函数名称split已在括号内.关于这种功能使用的文档很难在Google上找到,所以我找不到任何关于它的信息.有人可以解释一下吗?谢谢.

Chr*_*ner 5

使用split默认是一切都没有用- 它是$_按空格分割并返回值列表.

(...)[8]被称为列表切片,它过滤掉除了返回的第9个值以外的所有值split.前面的加号是为了防止Perl将括号误解为函数调用的一部分.这也意味着你不需要它在第二个实例上.

所以print +(split)[8];基本上是一种非常简洁的写作方式

my @results=split(/ /,$_);
print $results[8]; 
Run Code Online (Sandbox Code Playgroud)

您所包含的示例是执行split两次,因此执行更详细的版本可能更有效,因为您可以$results[4]从上面获得更多详细信息而无需任何额外的努力.

或者因为您可以在其中放入索引列表[],您可以执行拆分一次并使用printf格式化输出

printf "%s size: %s\n", (split)[8,4];
Run Code Online (Sandbox Code Playgroud)

  • 你可能想详细讨论`split`如何返回一个列表,而`(...)[4]`本质上使用列表上下文中的返回值,并访问该列表的第5个元素,之后丢弃整个列表. (2认同)
  • 你将`+(...)`描述为一个单元,然后是`[8]`.但是`(``)[``]`实际上是一个单独的运算符(列表切片).你不能没有'[8]`. (2认同)