2017-08-28 4 views
0

から複数の値を返すとき"または" vs "||"サブ

sub return_hash_and_array{ 
    my %hash = ('key_1' => "value_1", 'key_2' => 'value_2'); 
    my @array = ("item", "item2"); 

    if (@array > 0){ 
    return(\%hash, \@array); 
    }else{ 
    return; 
    } 
} 

をこのサブを使用している場合、私は両方を期待以下は

my ($href_hash, $aref_array) = return_hash_and_array() 
            || die "ERROR: blah"; 

を動作しませんなぜあなたは説明してくださいしかし、これは

my ($href_hash, $aref_array) = return_hash_and_array() 
            or die "ERROR: blah"; 

の作品でした同じことをしてください。

答えて

4

||orは異なる優先順位を持つので、あなたはどちらの演算子がスカラコンテキストでその左辺を評価

my ($href_hash, $aref_array) = (return_hash_and_array() || die("ERROR: blah")); 

(my ($href_hash, $aref_array) = return_hash_and_array()) or die("ERROR: blah"); 

対持っていますが、それらは異なるLHSオペランドを持っています。あなたの最初のスニペット— || —を使用して1、あなたは正確に一つのスカラー( \@arrayまたは undef)を返すように、それを強制的に、スカラコンテキストで return_hash_and_array()を評価しています。

+0

私はいつも混乱してしまいます。と "or"。私がいつも "||"を考えるときはいつも "or"を使うべきですか?いつあなたは "||"を使わなければなりませんか?あなたの例では、私はなぜ "||"操作を強制しているので、 "||"を使うのは良い考えです。 – JohnnyLoo

+0

@JohnnyLoo 'or'はフロー制御に適しています - ' my $ v = open ... or die $ !; 'は' or'の前のすべてを行い、最後にfalseを返したら他のオプションに行きます。 'my $ arg = shift // 'default';' - 'shift'が' undef'を返した場合、割り当ての前に必ず 'default'を使うようにしてください(同じものは '||'と同じです)。スカラーコンテキストを忘れないでください。 (答えのかっこは、優先順位の規則のために注文が何であるかを強調するためだけにあります) – zdim

+0

私は同意して、デフォルトでは '||'を使用しますが、 'または' '、' or return')を返します。 – ikegami

関連する問題