2011-12-13 21 views
2

私はPerlを学び始めており、次のPerlコードの部分について質問しています。は、Perlコードの一部に問題があります

"my"はローカル変数を定義するために使用され、 "shift"は配列からヘッド要素を取得するために使用されることがわかります。私が混乱したのは、配列が次のコードセグメントのどこから来たのかということです。

さらに、my @positives = keys %{$lab1->{$cate1}}は何の略ですか?

preData($cate1, $lab1) 

sub preData 
{ 
    my $cate1 = shift; 
    my $lab1 = shift; 

    my @positives = keys %{$lab1->{$cate1}}; 
} 
+0

可能重複[(シフトん何を)Perlでいますか?](http://stackoverflow.com/questions/296964/what-does-shift-do-in-perl) –

+0

いいえ、この質問は 'shift()'が何であるかについてではなく、ハッシュリファレンス逆参照について質問しています。ユーザーは、 'shift()'が何のためのものか知っていると言います。 – CanSpice

+0

-1 1つの投稿で2つの質問をして、どちらの質問にどの答え/コメントが含まれるかを前後にわたります。 – tadmc

答えて

5

$lab1は、他のハッシュリファレンスを含むハッシュリファレンスです。 $cate1はカテゴリキーの一種です(私は推測しています)。

$lab1->{$cate1}はハッシュリファレンスです。 %{ ... }を参照して逆参照すると、ハッシュバックが返されます。このハッシュはkeys()関数に渡され、そのハッシュのキーのリストが返されます。したがって、@positivesは、$lab1->{$cate1}ハッシュリファレンスによって参照されるハッシュ内のキーの配列です。

編集:これらの種類のネストされた構造を扱う場合、データの表現を見ることで何が起こっているのかを理解することが簡単にわかります。スクリプトの上部にuse Data::Dumperと入力します。

print Dumper($lab1); 
print Dumper($lab1->{$cate1}); 

をそして、あなたは@positives配列を設定した後、追加します:次にmy $lab1...my @positives...線の間に、追加します。これは、あなたがより良いデータを視覚化できるようにする必要があり

print Dumper(\@positives); 

、できればのより良い理解を得ますPerlの構造。

2

Perlでサブルーチンを呼び出すと、そのサブルーチンへの引数が@_配列に渡されます。パラメータを指定しないでshiftを呼び出すと、その引数が@_配列から取り出されます。したがって、このコードでは、最初のパラメータからpreDataに$ cate1を、2番目のパラメータからpreDataに$ lab1を取っています。

2

@は配列を表し、%はハッシュを表します。だから、この文:

my @x = keys %y; 

手段は、ハッシュyからキーのリストを取得し、配列xに割り当てます。すなわち、%yがある場合:

one => 1, 
two => 2, 
three => 3 

その後@xが含まれますの

one, two, three 
関連する問題