2013-06-07 11 views
13

私はPerlのスクリプトに変更を加えなければなりません。これはPerlを理解するための私の最初の試みです。私は、以下を参照してください。珍しいPerlの構文

my %trades; 
... 
foreach my $row (@$rows) { 
    @{$trades{pop @$row}} = @$row; 
} 

我々が配列@$row内の最後の項目をオフにポップし、ポップされたアイテムであることを%tradesのハッシュキーを設定し、設定されているように見えるので、私はこれで混乱しています値は@$rowです。

この理解は正しいですか?

+10

ちょうどスタイルノート:これは一般的に言語の "Perl"、プログラムの "perl"です。 Shiftキーが押されていない限り、PERLではありません。 :) – cHao

+0

'$ trades {pop @ $ row} = $ row;'または 'my $ id = pop @ $ row;と書くこともできます。 $ trades {$ id} = $ row; ' – ikegami

+0

@ ikegami:いいえ。 – Borodin

答えて

26

コードのその部分を理解するために、私たちは三つの明確にする必要があります。

  • 評価順序:

    EXPR_A = EXPR_B 
    

    EXPR_Aを評価する前にEXPR_Bを評価します。

  • コピーセマンティクス:@new_arrayにオーバー

    @new_array = @old_array 
    

    コピー@old_arrayの値を。

  • 複雑なデータ構造の間接参照:

    @{ $trades{$key} } 
    
    %trades

    はハッシュで$keyというエントリにアクセスし、配列リファレンスとして扱い。

    foreach my $row (@$rows) { 
        my @copy = @$row; 
        my $key = pop @$row; 
        @{ $trades{$key} } = @copy; 
    } 
    

    例えばので

    (すべての副作用を維持しながら、私が見ることができる)

    $rows = [ 
        [1, 2, "keyA"], 
        [3, 4, "keyB"], 
    ]; 
    

    を作成します。一緒に

は、あなたのコードは、これに相当します
%trades = (
    keyA => [1, 2, "keyA"], 
    keyB => [3, 4, "keyB"], 
); 
$rows = [ 
    [1, 2], 
    [3, 4], 
]; 

この行を書いた人は、評価の順序について非常に正確な知識を持ち、メンテナンスプログラマーを悩ますのが大好きです。

+2

具体的には、 '%trades'に' @ rows'の各行のコピーを埋め込むように見えます。ここで、各エントリのキーはその行の最後の列の値です。 – Alnitak

+0

私はあなたの最後のコメントのためだけに+1 000を持っています。 – czchlong

+6

そのコードを書いた人は誰でもPerlを知っているかもしれませんが、良いソフトウェア開発の方法についてはあまり知られていません。 Perlには、大部分の企業がそれを使用することを拒否するという驚くべき評判がありました。 – DVK

3

ループはこのよう@$rowsが修飾されていないままであることを除い

my %trades = map { $_->[-1] => [ @$_ ] } @$rows 

と等価です。 IMOそれはそのように書かれるべきです。

+0

$行の各行の最後の要素は、元のコードでは失われています。 –

関連する問題