Studio3104::BLOG.new

uninitialized constant Studio3104 (NameError)

Perlではifの中に別の変数スコープを持つという認識でいいのか・・・?


Perlでこんなコードを書いたら怒られますね。外からは見えないのよ。

#!/usr/bin/env perl

use strict;
use warnings;

if (1){
  my $strings = '外から見えるのよ';
}
print $strings;
Global symbol "$calar" requires explicit package name at - line 9.
Execution of - aborted due to compilation errors.

シェルが値を返しました 255

でもRubyで同じようなコードを書いてみたら怒られません。

#!/usr/bin/env ruby

if true
  strings = '外から見えるのよ'
end
p strings
外から見えるのよ

このことからこのような発言をしたわけですね。

これは大きな勘違い、、、なのか・・・?

さきほどのコード、「use strict;」をコメントアウトして、myを外して変数宣言すれば怒られませんよね。

#!/usr/bin/env perl

#use strict;
use warnings;

if (1){
  $calar = '外から見えるのよ';
}
print $calar;
外から見えるのよ

、、、というのが勘違いで、Perlだとmy付けないで作った変数はグローバル変数になるんだそうです。(いまさら知った)

ということで結論

Perlはifで別の変数のスコープを持つ
https://gist.github.com/4152579

#!/usr/bin/env perl

use strict;
use warnings;
use Data::Dumper;

my $x = 3;

if (1) {
    my $x = 2;
} else {
    my $x = 1;
}

warn Dumper +{x => $x};
$VAR1 = {
          'x' => 3
        };

Rubyは持たない。Pythonもjsも持たない。
Perlが異端

参考: http://blog.livedoor.jp/sasata299/archives/51312057.html
@さん、色々教えていただいてありがとうございました。