2011-01-26 4 views
2

arrayrefsとscalarrefsを値として持つハッシュリファレンスがあります。 arrayrefsの値にはアクセスできますが、スカラーのrefはアクセスできません。ハッシュリファレンス内でスカラーリファレンスを参照解除する


foreach (keys %$data) { 
    if (ref $data->{$_} eq 'ARRAY') { 
    push @values, $data->{$_}[0]; 
    } 
    elsif (ref $data->{$_} eq 'SCALAR') { 
    push @values, $data->??? 
    } 
} 

どうすればよいですか?スカラ参照を逆参照

答えて

7

、ちょうどスカラーシギル、$で値を序文:あなたではなく、最初の配列リファレンス要素に逆参照されているとして、あなたの配列リファレンスケースは、かなり右ではありません

if (ref $data->{$_} eq 'SCALAR') { 
    push @values, ${$data->{$_}}; 
} 

配列のすべての要素を取得するよりもしかし、スカラーを格納しているので、arrayrefの値をすべてスカラーに変換しない限り、arrayrefの値をすべて格納することはできません。たとえば、arrayrefの要素の数を求めます(これは評価時に得られます)。スカラーコンテキストでの配列)、またはすべての配列要素を連結して文字列にすることによって実現できます。

perldoc perlref参照してください:どこでもあなたが変数やサブルーチン名の一部として識別子(または識別子のチェーンを)入れたい、あなたと識別子を置き換えることができます参照

  1. を使用して

    を正しいタイプの参照を含む単純なスカラー変数:

$bar = $$scalarref; 
push(@$arrayref, $filename); 
$$arrayref[0] = "January"; 
$$hashref{"KEY"} = "VALUE"; 
&$coderef(1,2,3); 
print $globref "output\n"; 

具体的には、$ arrayref [0]または$ hashref {"KEY"}を逆参照しないことが重要です。スカラ変数の逆参照は、キー参照を行う前に発生します。単純なスカラ変数よりも複雑なものは、メソッド2または3を使用する必要があります。しかしながら、「単純スカラー」は、方法1を再帰的に使用する識別子を含む。したがって、次のように "howdy"が表示されます。

$refrefref = \\\"howdy"; 
print $$$$refrefref; 
+0

ありがとうございました!あなたの他の懸念事項としては、文脈がなければ間違っていると思いますが、コードのこの特定の部分では、配列の最初の要素が@valuesにプッシュされている必要があります。とにかくありがとう! – Ricky

+0

@Ricky:http://perlmonks.org/?node=References+quick+referenceも参照してください。 – ysth

1

あなたが%$dataの値を持つ唯一気になる場合、あなたはキーの代わりにそれらをループすることができます:

for my $value (values %$data) { 
    if (ref $value eq 'ARRAY') { 
     push @values, $value->[0]; 
    } elsif (ref $value eq 'SCALAR') { 
     push @values, $$value; 
    } 
} 

より簡潔で読みやすい、私見。

関連する問題