0

这是我的代码

#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

my $file = $ARGV[0];
system('wc -l $file');
print "\nprinting alpha \n";
sleep 1;
exit;

在我运行(在tcshshell 中)之后,perl script.pl /path/to/fileprinting alpha直到按下Ctrl+C. 即使我$|=1在系统调用之前或之后添加另一个语句,行为仍然保持不变。

怎么了?

4

2 回答 2

4

您正在执行 shell 命令

wc -l $file

shell 没有$file定义变量,所以这与

wc -l

这会导致 shellwc使用单独的 arg执行-l。在没有提供文件名的情况下,wc依次从 STDIN 读取,直到您使用 Ctrl-C 中的 SIGINT 将其终止。


你的目标可能是

system("wc -l $file");   # XXX

但这也是错误的。这不会传递 args-l$fileto的值wc。考虑如果提供了一个带有空格的文件名会发生什么。

要构建导致正确文件名的 shell 文字,您可以使用

use String::ShellQuote qw( shell_quote );
system(shell_quote('wc', '-l', $file));

但更好的选择是避免使用 shell 并wc直接执行,将所需的值传递给它,而无需构建 shell 命令。

system('wc', '-l', $file);
于 2013-03-15T06:49:11.603 回答
1

因为单引号防止$file. 改为双引号。

正在发生的事情是正在执行字符串而不用$file. 当 shell 得到这个时,它会寻找一个$file不存在的 shell 变量,所以它执行没有文件的命令。这会导致wc从标准输入读取,从而导致您看到的行为。

于 2013-03-15T06:42:13.840 回答