5

UNIX コマンドの戻り値を perl 変数に入れるのに問題があります。

Unix コマンド:

#nc -z 8.8.8.8 441; echo $?
1

Perl コマンド:

#perl -e 'my $pstate=`nc -z 8.8.8.8 441; echo $?`; print $pstate;'
0

それで、perl コマンドは「エラーなし」の戻り値を取得するように見えますか? *nix コマンドの戻り値を正しく取得するにはどうすればよいですか?

別の例:

#perl -e 'my $pstate=`ping -v 8.8.8.8 -c 1`; print $pstate;'
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.

これにより、適切な値が返されます。では、最初のインスタンスで何が間違っているのでしょうか?

4

2 に答える 2

9

変数はバッククォート内で補間されるため、$?in

my $pstate=`nc -z 8.8.8.8 441; echo $?`

$?シェルの ではなく、Perl の を指し$?ます。そして、シェルが見るのは次のようなものです

nc -z 8.8.8.8 441 ; echo 0

これを修正するには、シェル コマンドをエスケープします。

my $pstate=`nc -z 8.8.8.8 441; echo \$?`;

またはqx、単一引用符をセパレーターとして演算子を使用します (これは、「qx演算子内の補間」ルールの 1 つの例外です)。

my $pstate=qx'nc -z 8.8.8.8 441; echo $?';

またはreadpipe補間されていない引用構造で使用する

my $pstate= readpipe( 'nc -z 8.8.8.8 441; echo $?' );
my $pstate= readpipe( q{nc -z 8.8.8.8 441; echo $?} );
于 2013-08-14T05:21:54.453 に答える