root/websites/perl-users.jp/ttroot/articles/advent-calendar/2008/04.html @ 25922

Revision 25922, 2.8 kB (checked in by drry, 5 years ago)
  • whitespace change.
Line 
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 =&gt; 'a', 2 =&gt; 'b', 3 =&gt; 'c'};
13    my $code_ref = sub {'a'};</code></pre>
14
15<p>
16Perlでは、無名配列のリファレンス 無名ハッシュのリファレンス、無名サブルーチンのリファレンスはこのように書けますが、無名スカラーのリファレンスを書く特別な構文はないので、以下のように書きます。
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-&gt;new;
41    # $person-&gt;{name} = 'Tom'; #エラー
42    $person-&gt;name('Tom');
43    warn $person-&gt;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-&gt;new-&gt;process(\"&#91;% foo %&#93;", {foo =&gt; 3})</code></pre>
57
58<p>とかでも使うそうです。</p>
59
60<p>typseterさんに指摘されて思い出しましたが、そういえばDBICでも使いますね。</p>
61
62<pre><code>    select =&gt; [
63        \"date_trunc ('day', created_on) as created_day",
64        { count      =&gt; '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>
Note: See TracBrowser for help on using the browser.