#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
print "Content-type: text/html; charset=utf-8\n\n";
print "\n";
print "\n";
print "
\n";
print "CGI test\n";
print "\n";
print "\n";
print "----------
\n";
#レキシカル変数
# スコープの中で宣言されたレキシカル変数(myで宣言された変数)は、
# そのスコープ内でしか参照することができない。
# また変数に含まれる値はスコープが終わった時点で解放される。
{
my $num = 1;
print "aa0:$num
\n"; # 参照できる
}
#print $num; # この位置では参照できない
print "----------
\n";
#localで変更されたパッケージ変数
#localを使うとパッケージ変数を一時的に変更することができます。この変更された値は、スコープの最後で元に戻ります。
#localは、パッケージ変数の値の一時的な変更にだけ利用して、昔のように変数宣言には使わないようにしましょう。
our $NUM0 = 1;
{
local $NUM0 = 2;
print "cc0:$NUM0
\n"; #2
}
print "cc1:$NUM0
\n"; # この位置では1に戻る
#------------------------------------------
#スコープの内部で宣言されたパッケージ変数(ourで宣言された変数)は、
#そのスコープの中では部分名で参照できる。
#スコープの外から参照するには完全修飾名を使用する必要がある。
package Foo;
{
our $NUM = 1;
print "bb0: $NUM
\n"; # 部分名で参照できる
}
#print $NUM,"
\n"; # 部分名では参照できない
print "bb1: $Foo::NUM
\n"; # 完全修飾名で参照できる
#----------------------------------------
our $var = 123;
{
local $var = 345;
&say_var;
}
&say_var;
sub say_var {
print "\$var :",( $var // "undefined" ),"
\n";
}
print "----------
\n";
my $word = "晴れ";
&foo;
sub foo {
$word = "雨";
print "1:",$word,"
\n"; #雨
&yesterday;
print "4:",$word,"
\n"; #雨1111
}
sub yesterday {
print "2:",$word,"
\n"; #雨
$word = "雨1";
&tommorow;
}
sub tommorow {
print "3:",$word,"
\n"; #雨1
$word = "雨11";
}
print "5:",$word,"
\n"; #晴れ 雨1111
print "----------
\n";
print "\n";
print "\n";