| 1 | [%- SET TITLE = '無名スカラー変数のリファレンス' -%] |
|---|
| 2 | <?xml version="1.0" encoding="UTF-8"?> |
|---|
| 3 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> |
|---|
| 4 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> |
|---|
| 5 | <head profile="http://purl.org/net/ns/metaprof"> |
|---|
| 6 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> |
|---|
| 7 | <title>[% TITLE | html %]</title> |
|---|
| 8 | </head> |
|---|
| 9 | <body> |
|---|
| 10 | <h1>[% TITLE | html %]</h1> |
|---|
| 11 | <pre><code> my $array_ref = [qw/a b c/]; |
|---|
| 12 | my $hash_ref = +{1 => 'a', 2 => 'b', 3 => 'c'}; |
|---|
| 13 | my $code_ref = sub {'a'};</code></pre> |
|---|
| 14 | |
|---|
| 15 | <p> |
|---|
| 16 | Perlでは、無名配列のリファレンス 無名ハッシュのリファレンス、無名サブルーチンのリファレンスはこのように書けますが、無名スカラーのリファレンスを書く特別な構文はないので、以下のように書きます。 |
|---|
| 17 | </p> |
|---|
| 18 | |
|---|
| 19 | <pre><code> my $scalar_ref = \do {'a'};</code></pre> |
|---|
| 20 | |
|---|
| 21 | <p> |
|---|
| 22 | これはDamian Conway先生オススメのインサイドアウトオブジェクトのコンストラクタで見られる書き方です。 |
|---|
| 23 | </p> |
|---|
| 24 | |
|---|
| 25 | <pre><code> { |
|---|
| 26 | package Person; |
|---|
| 27 | my %props = (); |
|---|
| 28 | sub new { |
|---|
| 29 | my $class = shift; |
|---|
| 30 | $prps{name} = 'John'; |
|---|
| 31 | bless \do{''}, $class; |
|---|
| 32 | } |
|---|
| 33 | sub name { |
|---|
| 34 | my ( $self, $arg ) = @_; |
|---|
| 35 | $props{name} = $arg if $arg; |
|---|
| 36 | return $props{name}; |
|---|
| 37 | } |
|---|
| 38 | } |
|---|
| 39 | |
|---|
| 40 | my $person = Person->new; |
|---|
| 41 | # $person->{name} = 'Tom'; #エラー |
|---|
| 42 | $person->name('Tom'); |
|---|
| 43 | warn $person->name; # Tom</code></pre> |
|---|
| 44 | |
|---|
| 45 | <p> |
|---|
| 46 | こうすることによってスカラーをバックエンドとするオブジェクトを作ることができ、オブジェクトのカプセル化をすることができます。 |
|---|
| 47 | </p> |
|---|
| 48 | |
|---|
| 49 | <p>さらにid:tokuhiromさんの指摘で </p> |
|---|
| 50 | |
|---|
| 51 | <pre><code> my $scalar_ref = \'a';</code></pre> |
|---|
| 52 | |
|---|
| 53 | <p>でもよいことを知りました。</p> |
|---|
| 54 | <p>ただしこの場合はimmutableされて変更ができなくなるので先ほどの例では「<samp>Modification of a read-only value</samp>」とエラーになります。</p> |
|---|
| 55 | |
|---|
| 56 | <pre><code>Template->new->process(\"[% foo %]", {foo => 3})</code></pre> |
|---|
| 57 | |
|---|
| 58 | <p>とかでも使うそうです。</p> |
|---|
| 59 | |
|---|
| 60 | <p>typseterさんに指摘されて思い出しましたが、そういえばDBICでも使いますね。</p> |
|---|
| 61 | |
|---|
| 62 | <pre><code> select => [ |
|---|
| 63 | \"date_trunc ('day', created_on) as created_day", |
|---|
| 64 | { count => 'id' } |
|---|
| 65 | ]</code></pre> |
|---|
| 66 | |
|---|
| 67 | <p>または音速のXS使いid:gfxさんのData::Utilを使うと</p> |
|---|
| 68 | |
|---|
| 69 | <pre><code> use Data::Util qw(anon_scalar); |
|---|
| 70 | my $scalar_ref = anon_scalar('a');</code></pre> |
|---|
| 71 | |
|---|
| 72 | <p>と書くことも出来ます</p> |
|---|
| 73 | |
|---|
| 74 | <p>次はid:hirose31さん</p> |
|---|
| 75 | </body> |
|---|
| 76 | </html> |
|---|