Rubyの罠?Perlの罠? [Perl] [misc]

| コメント(0) | トラックバック(0)

Ruby公式ドキュメントの trap::スコープ、制御構造 より、

・ローカル変数は本当にローカル。Perl の my とかとは違う
# Ruby
local = "hoge"
def hoge
  print local, "\n" # 未定義。エラー
end
hoge

# Perl
my $local = "hoge";
sub hoge {
    print $local, "\n"; #=> hoge
}
hoge;

この項目を書いた人は my ...ローカル変数 宣言だと思ったんだろうか...
my ...レキシカル変数 宣言であって、ローカル変数じゃないのに。

前掲のコードにおいては、 $local のスコープは登場時からコード末尾まで。
例えば、

#!perl
use strict;
package hoge;
my $local = 1;
package main;
print "local = $local\n";

とやると、 local = 1 が表示される。これは、 $local のスコープがレキシカルであり、やはり登場時からコード末尾(ファイルスコープの終わり)まで有効であるためである。
逆に、例えば、

#!perl
use strict;
package hoge;
use vars qw($local);
$local = 1;
package main;
print "local = $local\n";

これは怒られる。何故なら、
* strict 'vars' が効いていて、
* 4行目では hoge パッケージ内の local という名前の scalar変数 ($hoge::local)を宣言していて、
* 7行目で参照しようとしている $local$main::local の省略形であって、これは宣言されていないから。

但し、 use vars で宣言された変数もローカルではない。
例えば、

#!perl
use strict;
package hoge;
use vars qw($local);
$local = 1;
package main;
print "local = $hoge::local\n";

これは local = 1 を表示するし、

#!perl
use stirict;
package hoge;
sub foo {
  use vars qw($local);
  $local = 2;
}
$local = 4;
package main;
print "before local = $hoge::local\n";
hoge::foo();
print "after local = $hoge::local\n";

これは before local = 4after local = 2 を表示する。

use vars はスコープじゃなくて、パッケージに対して作用するので、上記のような一見おかしいコードも実は問題はない。

結局のところ、 perl には ローカル変数 なんてものは存在しない。
存在するのは パッケージ名で修飾される普通の変数と、
字句解析的なスコープを持つレキシカル変数 だけである。
(package は字句解析的なスコープを作らない)

で、結論。
「比べるものが間違っとる」 > Rubyドキュメント

トラックバック(0)

トラックバックURL: http://floralcompany.jp/mt/mt-tb.cgi/176

コメントする

AUTHOR

  • turugina (虎王 剱奈)
  • E-mail: turugina {at} floralcompany.jp
  • pixiv
  • ニジエ

2014年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.2.10

- 警 告 -

本サイトにはいわゆる「18禁画像」(イラスト)へのリンクが存在します。 未成年の方や、その手の画像に不快感を覚える方は、 該当記事(「えちぃの」及び「ちょっとえちぃの」カテゴリ) をご覧にならないようお願いいたします。

上記を理解した上で非表示のブログパーツを表示する
あわせて読みたいブログパーツ
ついった
drawr/pixiv/twitpic