※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 パーラーになるべく、プログラミングPerlを呼んでいてパニックになった露木です。
$がついているだけでアレな感じ なのに、$@%&があって、しかも¥$とか出てきた日には、ぱにっくぱにっく。
「非常に低い優先順位を持つ新品でピカピカの演算子」も、分かってみればその通り!なんだけど、どんどん混乱させてくれるんだな、プログラミングPerl。
WassrでPerlのrefの勘所をエロいひとが教えてくれないかなぁ とぼやいたら、エロいひとたちがいっぱいやってきて教えてくれたよ! Perl の人たち暖かいよ!怖くないよ!
で、Perlのrefについて、とりあえず分かった気になった部分をメモっとく。続 はじめてのPerlにしっかり解説があるらしいから、なんとか入手するぞぉ
まず、Pythonで対話Shellが無いと辛い体になった俺は、cpanでShell::Perlを入れたよ。perl -de 1ってやってもいいんだけど、出力が見やすいからpirlコマンドが使いたいのさ。sudo cpanしてinstall Shell::Perlってしたら簡単に入ったよ。
ここから先は、
pirl@>って書いてあるのは、/usr/bin/pirlを実行した対話モードだよ。myすると行が変わったとたんに見えなくなるからmyしてないよ。
で、最初に知っておかなければならなかったのは、この挙動。COBOLからJavaへ、そしてPythonへと移ってきた(まだ職業Javaプログラマをしているが)俺は、想像もしなかったさ
$ /usr/bin/pril
pirl @> @list_a = (3,4,);
@var = (
3,
4
);
pirl @> @list_b = (1,2,@list_a);
@var = (
1,
2,
3,
4
);
list_bの3番目(添え字で2)にlist_aが入ると思うじゃん。でも、連結されて一つの配列になっちゃうんだよ。
次に、refを使ってやってみるよ。¥をつけるとrefを返すから、
pirl @> @list_b = (1,2,\@list_a);
@var = (
1,
2,
[
3,
4
]
);
うほっ。「複雑な構造を表現することができます」っていうのはこういうことなのか。
つまり、 refの勘所とかって話ではなく、refを使わないと配列のなかに配列を入れたりできない ってだけの話だった。
Javaなら、
import static java.lang.System.out;
import java.util.List;
import java.util.ArrayList;
public class Hoge {
public static void main(String[] args) {
List l = new ArrayList();
List list_a = new ArrayList() {
{ add("1");
add("2"); }
};
List list_b = new ArrayList() {
{ add("3");
add("4"); }
};
l.add(list_a);
l.add(list_b);
out.print("a: ");
out.print(l.get(0).get(0));
out.print(l.get(0).get(1));
out.print(" b: ");
out.print(l.get(1).get(0));
out.print(l.get(1).get(1));
}
}
// a: 12 b: 34 が出力される
Pythonなら
>>> list_a = [1,2]
>>> list_b = [3,4]
>>> l = [list_a,list_b]
>>> print 'a: ', l[0][0], l[0][1], ' b: ', l[1][0], l[1][1]
a: 1 2 b: 3 4
サブルーチンに配列を複数渡すとかも、罠だよ><
pirl @> @list_a = (1,2);
pril @> @list_b = (3,4);
pirl @> sub hoge { (my @a, my @b) = @_; print 'a:'; print @a[0];
print @a[1]; print ' '; print 'b:'; print @b[0]; print @b[1];}
pirl @> hoge(@list_a, @list_b);
a:12 b:
あれ?list_bはどこいった?
実は、@aの[2]と[3]に3,4が入ってる。配列を二つ渡せない><
なので、refを使ってスカラー($)で受ける。
pirl @> @list_a = (1,2);
pril @> @list_b = (3,4);
pirl @> sub hoge { (my $a, my $b) = @_; print 'a:'; print $a->[0];
print $a->[1]; print ' '; print 'b:'; print $b->[0]; print $b->[1];}
pirl @> hoge(¥@list_a, ¥@list_b);
a:12 b:34
#ためしにhoge(@list_a, @list_b);で呼び出すと、エラーになる
pirl @> hoge(@list_a, @list_b);
ERROR: Can't use string ("1") as an ARRAY ref while "strict refs" in
use at (eval 66) line 1, line 53.