無名スカラー変数のリファレンス

    my $array_ref = [qw/a b c/];
    my $hash_ref = +{1 => 'a', 2 => 'b', 3 => 'c'};
    my $code_ref = sub {'a'};

Perlでは、無名配列のリファレンス 無名ハッシュのリファレンス、無名サブルーチンのリファレンスはこのように書けますが、無名スカラーのリファレンスを書く特別な構文はないので、以下のように書きます。

    my $scalar_ref = \do {'a'};

これはDamian Conway先生オススメのインサイドアウトオブジェクトのコンストラクタで見られる書き方です。

    {
        package Person;
        my %props = ();
        sub new {
            my $class = shift;
            $prps{name} = 'John';
            bless \do{''}, $class;
        }
        sub name {
            my ( $self, $arg ) = @_;
            $props{name} = $arg if $arg;
            return $props{name};
        }
    }
    
    my $person = Person->new;
    # $person->{name} = 'Tom'; #エラー
    $person->name('Tom');
    warn $person->name; # Tom

こうすることによってスカラーをバックエンドとするオブジェクトを作ることができ、オブジェクトのカプセル化をすることができます。

さらにid:tokuhiromさんの指摘で

    my $scalar_ref = \'a';

でもよいことを知りました。

ただしこの場合はimmutableされて変更ができなくなるので先ほどの例では「Modification of a read-only value」とエラーになります。

Template->new->process(\'[% foo %]', {foo => 3})

とかでも使うそうです。

typseterさんに指摘されて思い出しましたが、そういえばDBICでも使いますね。

    select => [
        \"date_trunc ('day', created_on) as created_day",
        { count => 'id' }
    ]

または音速のXS使いid:gfxさんのData::Utilを使うと

    use Data::Util qw(anon_scalar);
    my $scalar_ref = anon_scalar('a');

と書くことも出来ます

次はid:hirose31さん