2006-05-11 ========== 今日のぺるる - grep, リファレンス --------------------------------- Reference URI: http://lowreal.net/logs/2006/05/11/1 Written Time: 2006-05-11T01:06:04+09:00 Tags: perl prog grep とリファレンスがわからなかった。 ちなみに一通りドキュメントは読んでみて、概念っぽいのはわかっているんだけど、実際の 挙動がわからない、という感じ。ようするにだめだめ。とぴあさんに助けてもらいつつちょ っとわかってきた。 [{:foo=>:a, :bar=>:b}, {:foo=>:c, :bar=>:d}].find {|i| i[:foo] == :a}[:bar]っていう Ruby のコードを Perl で書きたい場合。 # 答え(grep { $_->{foo} eq "a"} [{foo=>"a", bar=>"b"}, {foo=>"c", bar=>"d"}])[0]- >{bar};#以下間違い# クロージャのあとにカンマは要らないgrep { .. }, [..];# -> 演算 子によって左辺がスカラ文字列に変換されてしまうらしい# この場合 grep でヒットした配 列の数の文字列に対してハッシュ操作を# 行おうとするので、エラー(grep { .. } [])->{ bar};リファレンスを実データに戻す文法がわからなかった。 $a = [1, 2, 3]; #=> $a is reference of array@{$a}; #=> で array に戻る# @($a) と書 いて構文エラーそれと Hash ref, Array ref から直接アロー演算子使って中身を取り出すときの構文 $a = ["a", "b", "c"];$a->[1]; #=> "b"$h = {0 => "a", 1 => "b", 2 => "c"};$h->{1}; #=> "b"一番なるほど!て思ったのは $_ grep { $_ eq "a" } ("a", "b", "c");foreach (@{$a}) { print $_;}$_ ってよく見るけどなんやねんって思ってた。 grep {|$_| ..}っていう Ruby 風の説明をされてよくわかった。 疑問 foreach (@{$a}) { foreach (@{$b}) { $_; } $_; #=> スコープは?}あとで実行してみよう。 foreach $i (@{$a}) { foreach $j (@{$b}) { print "$i, $j"; }}みたいにかけるのかな。my をつけるべき? (つけられる?) っていうか for と foreach は同じなのね コメントでの指摘で修正 今日のぺるる $_ の続き。 ------------------------- Reference URI: http://lowreal.net/logs/2006/05/11/2 Written Time: 2006-05-11T10:50:40+09:00 Tags: perl prog my @a = ("a", "b", "c");for (@a) { for (@a) { print $_; } print " \n $_\n";}__END__abc aabc babc cちゃんとブロックローカル (?) だった。