今日のぺるる - grep, リファレンス
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 は同じなのね
コメントでの指摘で修正
関連エントリー
- ECMAScript Object.prototype 昨日書いたのは間違いだったっぽい…… function Foo(len) { this.length = len; } Foo.protot...
- C言語のポインタ配列の const の効果 ポインタ配列の const が理解できなかったのでメモ 検証コード const char* const foo[] = {"foo","ba...
- perl 5.19.9 の signatures 構文 (普通に引数を書ける構文) を試す Perl 5.19.9 で実装された signatures の構文をためしてみる - tokuhirom blog を見てそんなのできたのか...
- Ruby でメソッドの一時的な上書き テストとかでやりたくなると思うけど、こんなくだらないことに gem とか使いたくないので、簡単に書ける方法をさがしてる。 class Foo...
- Ruby でネストした構造体文字列をネストした配列として unpack する Cの構造体とかだと、構造体の中に他の構造体ということは普通にあります。 こういった構造体の文字列を unpack すると、全部フラットな配列...