我正在尝试编写一个perl一个衬里,以列出目录的内容,例如" ls -l" unix命令,但是我只想输出目录而不是文件
我设法使用perl脚本进行了操作,但我想尝试使用
之类的管道来查看它是否可以将其简化为单行ls -l | grep "something"
或
ls -l | perl -...
到目前为止,我这样做的方式是这个
#!/usr/bin/perl
open(LS_D, "ls -l |");
while(<LS_D>) {
print if /^d.*/; #print line if line starts with d
}
您还可以告诉我为什么这与" LS -L |"中的管道一起使用。但不是" LS -L"?
谢谢
目录的长列表可以直接使用
获得ls -ld */
无需过滤输出。
至于|
,这就是您告诉打开过程并替换其STDIN
或STDOUT
对于三个或多个参数,如果模式为
|-
,则将文件名解释为要管道输出的命令,如果模式为-|
,则将文件名解释为将输出输出输出的命令。在两种词汇(和一个argument(表单中,应该用命令替换dash(-
(。有关更多示例,请参见perlipc中的IPC的open((。
没有|
,因此使用open(LS_D, "ls -l")
,您正在尝试打开 file ,名称'ls -l'
建议使用其词汇fileHandle进行的三项 open
为
open my $read_fh, '-|', 'ls', '-l';
提供了带有参数的命令作为列表。
最后,您可以使用单线仪来完成您在perl脚本中所拥有的操作,例如
perl -we'print grep { /^d/ } `ls -l`'
,但是,如上所示,您可以在命令行上直接使用ls
获得。
我应该添加
始终在程序顶部具有
use warnings;
和use strict;
始终检查
open
的呼叫,您会知道并查看故障的原因open my $fh ... or die "Can't open ... : $!";
请参阅
$!
的perlvar中的错误变量