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;

tcshシェルで)実行した後、 を押すまでperl script.pl /path/to/file表示されません。システムコールの前後に別のステートメントを追加しても、動作は同じままです。printing alphaCtrl+C$|=1

何が起こっている?

4

2 に答える 2

4

シェルコマンドを実行しています

wc -l $file

シェルには変数が$file定義されていないので、それはと同じです

wc -l

これにより、シェルwcは唯一のargで実行され-lます。ファイル名が指定されていないwc場合は、Ctrl-CからSIGINTを使用してファイルを強制終了するまで、STDINから読み取ります。


あなたはおそらく目指していた

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

しかし、それも間違っています。-lこれは、の引数と値をに$file渡しませんwc。スペースを含むファイル名が指定された場合にどうなるかを考えてみてください。

正しいファイル名になるシェルリテラルを作成するには、次を使用できます。

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

ただし、シェルを避けてwc直接実行し、シェルコマンドを作成せずに必要な値をシェルに渡すことをお勧めします。

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

一重引用符は の補間を妨げるためです$file。二重引用符に変更します。

何が起こっているかというと、 の値を代入せずに文字列が実行されているということです$file$fileシェルがこれを取得すると、存在しないシェル変数を探すため、ファイルなしでコマンドを実行します。これによりwc、標準入力から読み取られ、表示される動作が発生します。

于 2013-03-15T06:42:13.840 に答える