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 は同じなのね
コメントでの指摘で修正