Hatena::Groupperl

mashivの日記

2009-06-13リストと配列

とりあえず結論。

「リストと配列は違う」


my $ref = [1,2,3,4];
my @arr = wq(1 2 3 4);
my $ref2 = \@arr;

上のような書き方はよくするわけだが、そうするとついつい

my $ref = \qw(1 2 3 4);

で配列のリファレンスが得られるような気がしてしまう。


しかし、wq(1 2 3 4) は配列ではない、リストだ。

だから、\qw(1 2 3 4) は (\'1', \'2', \'3', \'4') のように解釈される。


だから、正しい? のは以下ような使い方だ。

my ($ref1, $ref2, $ref3, $ref4) = \qw(1 2 3 4);
print $$ref1;
print $$ref2;
print $$ref3;
print $$ref4;

あれおかしいな、じゃあ

my @num = (1,2,3,4);
foreach my $num (@num){
	print "$num \n";
}

foreach my $num (qw(1 2 3 4)){
	print "$num \n";
}

上の2つは同じように動作するんだけど……ってなる。


それは foreach (ARRAY){} じゃなくて foreach (LIST){}だから。


だから、当然こんな使い方もできる。

my $list = [132, 44];
for my $str (1..9, @$list, 'a'..'z', 'moge', qw(req e32)){
	print "$str\n";
}

Perlの配列 = LISTだと思ってた……

何となくスルーしていたのでメモ。