2010-11-24 14 views
0

ここでは私が取り組んでいた楽しいコードスニペットがあり、私の人生は私が間違っていることを理解できません。あまりにも複雑な条件付き操作の質問

(chomp($CMD=`whereis blah | awk '{print \$2}'`) || 
    chomp($CMD=`whereis cat | awk '{print \$2}'`)) ? 
    (print "$CMD\n") : (print "Neither command exists."); 
print "$CMD\n"; 

これを実行すると、空の文字列が常に出力されます。私が知る限り、$ CMDへの2番目の割り当ては決して実行されません。純粋にデモンストレーションの目的で、私は「ああ」と「猫」を含めました。理想的には、指定されたシステムにインストールされているか、インストールされていないかもしれない2つのコマンドをチェックします。これが条件付きの内部に入れ子にされた2つの割り当てを持つ理由です。これらのどちらも見つからない場合(したがって2つの空の文字列)、私はfalse節を実行したいと思います。しかし、いずれかのコマンドが存在する場合は、それを$ CMDに割り当て、真の句を実行します(上の例では$ CMDを出力するだけです)。私は様々な組み合わせで演奏してきましたが、この作業を行うことはできません。

同じ結果を得るためにこれを分解して実行することができますが、好奇心と頑固さが私の方が優れている理由は分かりません。あなたが提供できるどんな助けも大歓迎です。

+2

私はむしろ、空の文脈で条件演算子を使用することを嫌っています。あるいはawkに何かperlishをするよう呼びかけます。 – tchrist

答えて

4

Perlのchompは、削除された文字数を返します。chompの文字列ではありません。

しかし、このような問題への一般的な答えとして、私は仕事のようなものを得ることができなければ、私は完全にそれを拡張します(そして単純化すると、外部の依存関係や、関連性はありません)。すべての動作が見えるようになるまで(たとえば、各ステートメントセット間に戻り値を出力するなど)。それが終わると、私は文章をまとめて、それがまだ機能するようにチェックします。

これで完了したら、今までのものと前回のものを比較して、それがうまくいかなかった理由を説明する必要があります(しかし、道に沿って関数はあなたが期待していなかったものを返していました)。

3

chompは、結果の文字列ではなく、削除された文字数を返します。

2

blahが見つからない場合、whereis blahの出力がちょうど

blah: 

whereis blah | awk '{print $2}'の出力は単に空行(すなわち、単に改行文字)です。あなたのPerlスクリプトでは、$CMDは最初に"\n"に設定され、その後はchomp 'になります。 chompが1を返すので、2番目のコマンド(whereis cat ...)は実行されません。だからあなたのプログラムはあなたが言ったことを正確に行っています。

私は単純なステートメントを試して、別の結果を得ようとします。

1
#!/usr/bin/env perl 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings qw< FATAL all >; 
use open qw< :std OUT :utf8 >; 

END {close STDOUT} 
$| = 1; 

sub whence(_) { 
    my($aout, $path) = shift(); 
    for my $bin (split /:/ => $ENV{PATH}) { 
     return $path if -f -x ($path = "$bin/$aout"); 
    } 
    # FALLTHROUGH 
} 

say "$_: ", whence for @ARGV; 
関連する問題