2013-03-15 58 views
0

这里是我的代码为什么系统调用会影响perl中的后续打印行为?

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

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

后,我走(tcsh壳)perl script.pl /path/to/file我没有看到printing alpha,直到我按Ctrl+C。即使在系统调用之前或之后添加另一条语句$|=1,行为仍然相同。

发生了什么事?

回答

4

您正在执行的shell命令

wc -l $file 

外壳没有定义变量$file,所以这是一样

wc -l 

这会导致孤独ARG -l执行wc外壳。在没有提供文件名的情况下,wc反过来从STDIN中读取,直到用Ctrl-C中的SIGINT杀死它。


你还有瞄准

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

但这是错了。这不通过参数-l和值$filewc。考虑如果提供了一个带有空格的文件名,会发生什么情况。

要建立文字壳的结果在正确的文件名,你可以使用

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

但更好的选择是避免外壳和直接执行wc,传递到你想要的值,而不必构建一个shell命令。

system('wc', '-l', $file); 
1

因为单引号可以防止插入$file。更改为双引号。

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

+1

感谢您的回答。我不得不接受另一个,因为它通知更多,但你也没关系。 – user13107 2013-03-15 06:55:32

相关问题