<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/xml.xsl" type="text/xsl"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title>nulog, NULL::something : out of the headphone &gt; 2006 &gt; May &gt; 11</title>
  <link href="http://lowreal.net/logs/2006/05/11"/>
  <icon>http://lowreal.net/img/banner.png</icon>
  <link rel="self" type="application/atom+xml" href="http://lowreal.net/logs/2006/05/11.atom"/>
  <link rel="alternate" type="application/xhtml+xml" href="http://lowreal.net/logs/2006/05/11.xhtml"/>
  <updated>2006-05-11T10:50:40+09:00</updated>
  <author>
    <name>cho45(砂糖)</name>
  </author>
  <id>http://lowreal.net/2006/05/11</id>
  <entry>
    <title>今日のぺるる - grep, リファレンス</title>
    <link rel="alternate" type="text/html" href="http://lowreal.net/logs/2006/05/11/1.html"/>
    <link rel="alternate" type="application/xml+xhtml" href="http://lowreal.net/logs/2006/05/11/1.xhtml"/>
    <updated>2006-05-11T01:06:04+09:00</updated>
    <published>2006-05-11T01:06:04+09:00</published>
    <id>http://lowreal.net/2006/05/11/1</id>
    <category term="perl"/>
    <category term="prog"/>
    <content type="xhtml" xml:base="http://lowreal.net/">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>grep とリファレンスがわからなかった。</p>
        <p>ちなみに一通りドキュメントは読んでみて、概念っぽいのはわかっているんだけど、実際の挙動がわからない、という感じ。ようするにだめだめ。とぴあさんに助けてもらいつつちょっとわかってきた。</p>
        <pre class="Ruby">[{:foo=&gt;:a, :bar=&gt;:b}, {:foo=&gt;:c, :bar=&gt;:d}].find {|i| i[:foo] == :a}[:bar]</pre>
        <p>っていう Ruby のコードを Perl で書きたい場合。</p>
        <pre class="Perl">
# 答え
(grep { $_-&gt;{foo} eq "a"} [{foo=&gt;"a", bar=&gt;"b"}, {foo=&gt;"c", bar=&gt;"d"}])[0]-&gt;{bar};

#以下間違い

# クロージャのあとにカンマは要らない
grep { .. }, [..];

# -&gt; 演算子によって左辺がスカラ文字列に変換されてしまうらしい
# この場合 grep でヒットした配列の数の文字列に対してハッシュ操作を
# 行おうとするので、エラー
(grep { .. } [])-&gt;{bar};
</pre>
        <hr/>
        <p>リファレンスを実データに戻す文法がわからなかった。</p>
        <pre class="Perl">
$a = [1, 2, 3]; #=&gt; $a is reference of array

@{$a}; #=&gt; で array に戻る
# @($a) と書いて構文エラー

</pre>
        <hr/>
        <p>それと Hash ref, Array ref から直接アロー演算子使って中身を取り出すときの構文</p>
        <pre class="Perl">
$a = ["a", "b", "c"];
$a-&gt;[1]; #=&gt; "b"

$h = {0 =&gt; "a", 1 =&gt; "b", 2 =&gt; "c"};
$h-&gt;{1}; #=&gt; "b"
</pre>
        <hr/>
        <p>一番なるほど！て思ったのは <code>$_</code></p>
        <pre class="Perl">
grep { $_ eq "a" } ("a", "b", "c");

foreach (@{$a}) {
    print $_;
}
</pre>
        <p><code>$_</code> ってよく見るけどなんやねんって思ってた。</p>
        <pre>grep {|$_| ..}</pre>
        <p>っていう Ruby 風の説明をされてよくわかった。</p>
        <hr/>
        <p>疑問</p>
        <pre class="Perl">
foreach (@{$a}) {
    foreach (@{$b}) {
        $_;
    }
    $_; #=&gt; スコープは？
}
</pre>
        <p>あとで実行してみよう。</p>
        <pre class="Perl">
foreach $i (@{$a}) {
    foreach $j (@{$b}) {
        print "$i, $j";
    }
}
</pre>
        <p>みたいにかけるのかな。my をつけるべき？ (つけられる？) っていうか for と foreach は同じなのね</p>
        <ins datetime="2006-05-11T10:29:25+09:00">
          <p>コメントでの指摘で修正</p>
        </ins>
      </div>
    </content>
  </entry>
  <entry>
    <title>今日のぺるる　$_ の続き。</title>
    <link rel="alternate" type="text/html" href="http://lowreal.net/logs/2006/05/11/2.html"/>
    <link rel="alternate" type="application/xml+xhtml" href="http://lowreal.net/logs/2006/05/11/2.xhtml"/>
    <updated>2006-05-11T10:50:40+09:00</updated>
    <published>2006-05-11T10:50:40+09:00</published>
    <id>http://lowreal.net/2006/05/11/2</id>
    <category term="perl"/>
    <category term="prog"/>
    <content type="xhtml" xml:base="http://lowreal.net/">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <pre class="Perl">
my @a = ("a", "b", "c");

for (@a) {
    for (@a) {
        print $_;
    }
    print "\n  $_\n";
}
__END__
abc
  a
abc
  b
abc
  c
</pre>
        <p>ちゃんとブロックローカル (?) だった。</p>
      </div>
    </content>
  </entry>
</feed>
