我试图在perl中使用以下命令,但它给了我错误
system("zcat myfile.gz | wc > abc.txt");
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个时,我收到意外令牌附近的错误语法错误`|'
即使我删除>abc.txt
我仍然会收到错误.
我们可以使用管道系统命令吗?
以下是错误详细信息:
sh: -c: line 1: syntax error near unexpected token `|'
sh: -c: line 1: ` | wc '
Run Code Online (Sandbox Code Playgroud)
下一次,测试您的演示程序,以确保它实际上展示了您所说的行为.你实际上跑得更近了
while (my $file_name = <>) {
system("zcat $file_name | wc > abc.txt");
}
Run Code Online (Sandbox Code Playgroud)
有两个错误:
您没有删除尾随换行符,因此shell正在尝试执行
zcat def.gz
| wc >abc.txt
Run Code Online (Sandbox Code Playgroud)
代替
zcat def.gz | wc >abc.txt
Run Code Online (Sandbox Code Playgroud)在将emndding它命令之前,您没有将文件名转换为shell文字.
考虑如果文件名包含空格会发生什么.你会执行
zcat def ghi.gz | wc >abc.txt
Run Code Online (Sandbox Code Playgroud)
代替
zcat 'def ghi.gz' | wc >abc.txt
Run Code Online (Sandbox Code Playgroud)解:
use String::ShellQuote qw( shell_quote );
while (my $file_name = <>) {
chomp($file_name);
system("zcat -- ".shell_quote($file_name)." | wc > abc.txt");
}
Run Code Online (Sandbox Code Playgroud)