準・究極の選択

質問が続いて恐縮なのですが、お願いします。
perlスクリプトでshellコマンドを呼び出したとき、
(以下、#!/usr/bin/perl は省略)

$y=`ls`;
print $y;
では結果がターミナルに表示される

print `ls`;
でも表示される

しかし、単に
`ls`
では何も表示されない。

`ls`;
print $_;
でも何も表示されない。

`ls [存在しないファイル]`
では標準エラーが表示される。

いったい
`ls`
の標準出力はどこに格納されるのでしょうか?

A 回答 (2件)

\ が足りないからです.



`...` では \ をエスケープするのに \\ としなければなりません. こんな感じ:
#!/usr/bin/perl
$x = `sed -n 's/a\\(X\\)b/\\1/p' test.txt`;
print $x;
    • good
    • 0
この回答へのお礼

なるほど!わかりました!

`...`は...を「そのまま」シェルに渡すと思いこんでいたのですが、私の解釈する「そのまま」とPerlが解釈する「そのまま」が違っていたのですね。
以下の例で納得できました。
ありがとうございました。

#!/usr/bin/perl

$z="sed -n 's/a\(X\)b/\1/p' test.txt";
$zz="sed -n 's/a\\(X\\)b/\\1/p' test.txt";
$zzz='sed -n \'s/a\(X\)b/\1/p\' test.txt';

$x=`$z`;
$xx=`$zz`;
$xxx=`$zzz`;

print "\$z = $z\n";
print "\$zz = $zz\n";
print "\$zzz = $zzz\n";
print "\$x = $x\n";
print "\$xx = $xx\n";
print "\$xxx = $xxx\n";

お礼日時:2004/12/03 14:03

`ls`を評価(実行)するが、標準出力は破棄されるハズ。

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

必ず破棄されるという決まりなら納得なのですが、さらにこまったことに、

$cat test.txt
aXb

のもとで、
sed -n 's/a\(X\)b/\1/p' test.txt
では
X
と表示されるのに、

$cat test.pl
#!/usr/bin/perl
$x=`sed -n 's/a\(X\)b/\1/p' test.txt`;
print $x;

$ ./test.pl

では何も表示されないというのは何故だ?
という疑問が新たに沸いてまいりまして。。。

なぜ上のlsの場合は$yに代入できて、この場合は$xに代入できないなどということが起こり得るのでしょうか?

この振舞いはどうやって説明されるのか御存じの方がおられましたら、ご教授下さい。

お礼日時:2004/12/03 12:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!