2016-04-21 11 views
2

Perlでは、配列のエントリから複数のローカル変数をきれいに割り当てる方法について、私は常に混乱してきました。perlの配列エントリに複数のローカル変数を割り当てる

私は潜水艦内のすべての時間を、次の構文を使用しますので、私はそれで多少よく知っている:

my ($var1, $var2) = @_ 

が、これの他のバリエーションは私を混乱させる。例えば、私は、動作、次のコードを持っている:

@matchingLines」は2つの要素の配列の配列である
for my $ctr (0 .. $#matchingLines) { 
     my $lineNo = $matchingLines[$ctr][0]; 
     my $text = $matchingLines[$ctr][1]; 

は私が明らかに最後の2行を変換することができたいと思います。もちろん動作しません

my ($lineNo, $text) = $matchingLines[$ctr]; 

こと。私は多数のバリエーションを試しましたが、動作するものは何も見つかりません。

+0

をお読みください。私はそれを理解することはできません。 (奇妙な、私が返信していたコメントは今や消えてしまった) –

+0

実際、私のコメントは時期尚早だったので、この場合はスライスが必要ない。 '$ matchingLines [$ ctr]'は配列リファレンスです。それを逆参照してください。 – ThisSuitIsBlackNot

答えて

2

配列の配列があるようです。つまり、内部配列は配列参照になります。それらをvarsに割り当てる場合は、それらを棄却する必要があります。

use strict; 
use warnings; 
my @matchingLines = (['y','z'],['a','b']); 
for my $ctr (0 .. $#matchingLines) { 
    my ($lineNo, $text) = @{$matchingLines[$ctr]}; 
    print "#Array index: $ctr - lineno=$lineNo - text=$text\n" 
} 

これは、あなたがPerlでリストコンテキスト対スカラーについて少し読むことができる出力

#Array index: 0 - lineno=y - text=z 
#Array index: 1 - lineno=a - text=b 
+4

以上: 'for(@matchingLines){my($ lineNo、$ text)= @ $ _; ...} ' – stevieb

8

ちょうど配列リファレンスをデリファレンス:

my ($lineNo, $text) = @{ $matchingLines[$ctr] }; 

その他の例についてPerl Data Structures Cookbookをチェックしてください。

0

を生成します。配列参照はスカラーであることも知っておくべきです。

#list in a scalar context 
my @arr = (1,2,3,4,5); 
my $len = @arr; 
print $len; 
>>5 

#scalar in list context 
my ($q, $w) = @arr; 
print "$q $w"; 
>>1 2 

# in case you have an array ref that you want to assign 
# to many variables, you should dereference them to bring 
# a list context , i.e 
my $arr_ref = \@arr; 
my ($r, $s) = @{$arr_ref}; 
print "$r, $s"; 
>>1,2 

あなたが関数を使用しながら、リストコンテキスト対スカラーについての詳細をお知りになりたい場合は、ハードの部分が有効なのスライス基準に配列参照を変換する方法である程度wantarrayオペレータ

+1

' /配列コンテキスト/リストコンテキスト/ g' – ThisSuitIsBlackNot

+0

ありがとう、私は編集します – goKishore

関連する問題