管道元素之间有什么区别,或者在Perl单行中指定它们作为参数?

the*_*olf 2 bash ubuntu perl

在学习Perl的同时,我也在学习Linux(Ubuntu),所以这里有点火热的时间.

有什么区别:

find . -type f | perl -nle '... #aka yada yada'
Run Code Online (Sandbox Code Playgroud)

perl -nle '... # same yada yada' `find . -type f`
Run Code Online (Sandbox Code Playgroud)

第一个将文件NAMES传递给Perl,第二个传递文件CONTENTS.在Unix或Perl的特殊属性下,这总是如此吗?

bri*_*foy 7

第一个生成文件列表并将其"管道"为perl.然后perl通过读取标准输入来读取列表:

 while( <> ) { ... }
Run Code Online (Sandbox Code Playgroud)

这在unix shell中很常见,所以你根本不需要使用perl:

 $ ifconfig | grep en0
Run Code Online (Sandbox Code Playgroud)

第二个生成文件名列表并将它们转换为命令行参数,然后在程序中显示@ARGV:

 foreach( @ARGV ) { ... }
Run Code Online (Sandbox Code Playgroud)

这个功能对Perl来说也不是特别的.shell在命令之后提供程序可以访问的某种数据结构中的位.其他语言也有类似的结构,即使它们看起来不一样.

但是,菱形运算符<>将自动遍历您在命令行中指定的文件名,以便while循环仍然有效.这是Perl特有的功能.

当你有一长串参数时,第二种方法的问题往往会出现.有些shell限制了可以在命令行上显示的内容.因为那个原因我不喜欢第二个版本.

但是,您可以将其转换为自包含的Perl程序,而不是使用find(1)(shell版本):

$ find2perl . -type f
Run Code Online (Sandbox Code Playgroud)

输出是一个Perl程序,不必依赖任何外部命令.