• このエントリーをはてなブックマークに追加
  • このエントリをクリップ! このエントリをクリップ!

はじめに

Data::Validator の SYNOPSIS を見ていて初めて「state変数」なるものを知ったので,簡単な確認など.

新しい変数の分類が導入されました. state 変数は my 変数とにていますが, my の代わりに state キーワードを使って宣言します. 変数はそのレキシカルスコープで見ることができますが, my 変数とは異なりその値は維持され, スコープに入ったときに未定義にされる代わりに以前の値を 再び得ます.
perl5100delta – perl 5.10.0 の新機能 【perldoc.jp】

Perl 5.10 以降で利用できるんですね.

確認

use 5.10;
use warnings;
 
sub f_my {
    return my $ret = do {
        warn 'foo';
        'foo';
    };
}
 
sub f_state {
    return state $ret = do {
        warn 'bar';
        'bar';
    };
}
 
f_my()     for 1..5;
f_state()  for 1..5;

f_myf_state ともに,内部でレキシカルな変数を作ってそのまま戻り値としています.

ともに5回ずつ呼び出してみます:

/Users/issm/Dropbox/blogdrafts/2012 % perl -v
 
This is perl 5, version 12, subversion 2 (v5.12.2) built for darwin-2level
 
Copyright 1987-2010, Larry Wall
 
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
 
Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl".  If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.
 
/Users/issm/Dropbox/blogdrafts/2012 % perl code/2012-02-19--perl-state-variable.pl
foo at code/2012-02-19--perl-state-variable.pl line 6.
foo at code/2012-02-19--perl-state-variable.pl line 6.
foo at code/2012-02-19--perl-state-variable.pl line 6.
foo at code/2012-02-19--perl-state-variable.pl line 6.
foo at code/2012-02-19--perl-state-variable.pl line 6.
bar at code/2012-02-19--perl-state-variable.pl line 13.

後者は保持されているっぽいです.

おわりに

ということで,今さらながら Perl の「state変数」について知ることができました.各バージョンの「delta」とかちゃんと読んどかないとですね><

コメントをドウゾ

will not be published.

  • twitter
  • facebook
  • github
  • hatena bookmark
  • SlideShare
  • flickr
  • foursquare
  • ustream
  • tumblr
  • friendfeed
  • mixi
  • Apple
  • WordPress
  • come icons are powered by komodomedia!