Hatena::ブログ(Diary)

Hatena::Diary::Neko::kak 500 Internal Server Error このページをアンテナに追加 RSSフィード

2005-09-01

[]Readonlyモジュールを遊んでみる

Perl Best Practicesを読んでて、

Readonlyモジュールなるものを知った。

http://search.cpan.org/~roode/Readonly-1.03/Readonly.pm

簡単に言えばuse constantの便利版かな。

Perl Best Practicesでは

use constantよりも

use Readonlyすることを推奨してます。

以下、理由&簡単なソース

Readonlyモジュール使用時

#! /usr/bin/perl
use strict;
use warnings;
use Readonly;
Readonly my $name => q[nekokak];
Readonly my $age  => q[27];
print <<"__EOD__";
Hi!
My name is $name.
My age is $age.
Bye.
__EOD__

こんな感じで書けます。

結果

Hi!
My name is nekokak.
My age is 27.
Bye.

こんなのが出力されます。

use constantの場合

#! /usr/bin/perl
use strict;
use warnings;
use constant name => q[nekokak];
use constant age  => q[27];
print <<"__EOD__";
Hi!
My name is name.
My age is age.
Bye.
__EOD__

こう書くと、

Hi!
My name is name.
My age is age.
Bye.

こんな出力になります。

なので、以下のように書く必要があります。

#! /usr/bin/perl
use strict;
use warnings;
use constant name => q[nekokak];
use constant age  => q[27];
print 'Hi',"\n\n";
print 'My name is ',name,".\n";
print 'My age is ',age,".\n\n";
print 'Bye.';

結果

Hi
My name is nekokak.
My age is 27.
Bye.

書き方にもよりますが、なんて醜いのでしょうかねぇ。

どうです?Readonlyの方がよいですよね?

ちなみに、

Readonly my $name => q[nekokak];

としているものに、値を入れようとすると、、、

Modification of a read-only value attempted at readonly.pl line 9

こんな感じで実行時にエラーになります。

perl -c は通りますね。

まあ、プラグマではないのでしかたないのですが。

Perl Best Practices