変数
Perlには混乱を招きやすい表現が多々あり、
(2)
use strictとuse warnings
「Perlはコードがわかりにくくなる」
use strict
ワンライナー以外のプログラムに関してはusestrict;
宣言をすることが推奨されています。これは、
use strict;
$var = 1; # エラー
use warnings
新規でコードを書く際にはuse warnings;
宣言をすることが推奨されています。これにより、
小飼弾さんの
スコープ制御
スコープとは、
レキシカルスコープ宣言とグローバル宣言
Perlでは、
my
my宣言した変数は、
{
my $var = 1;
}
print $var; # エラー
local
local宣言した変数は、
my %h = ( var => 'foo' );
{
local $h{var} = 'ok';
print $h{var}; # ok
}
print $h{var}; # foo
our
our宣言した変数はグローバル変数としてプログラム全体に対して定義され、use vars
と等価だと考えられており、
package SampleApp;
use strict;
use warnings;
our $VARIABLE = 1;
別の場所からグローバル変数にアクセスする際には、$名前空間::変数名
でアクセスします。省略した際にはデフォルトでmainというパッケージ名
package SampleApp2;
$SampleApp::VARIABLE;
よく使われる特殊変数
Perlには、
ここではよく使われる特殊変数を紹介します。
$_
$_
は非常によく使われる特殊変数です。デフォルト変数とも呼ばれ、
次の例では、$_
を表示させています。
my @array = ('cat', 'dog');
foreach ( @array ){
print 'array is: ' . $_ . "\n";
}
上記のコードは配列の中の要素を1つずつ取り出したものをデフォルトとして、
array is: cat
array is: dog
@_
@_
は、@_
から受け取りの際に一度代入することは、
sub foo {
my($x, $y) = @_;
print "$x, $y\n";
}
foo(1, 2);
実行結果は次のようになります。
1, 2
$@
$@
は、$@
を使うことで実現します。Perl組み込み関数のdieがJavaなどのthrowに該当しており、
evalには主に2種類の用途があります。
1つめは、
my $code;
for my $name ('foo', 'bar') {
$code .= qq/sub $name { print "this is $name\n" }/;
}
eval $code; # fooとbar
foo(); # tis is foo
bar(); # this is bar
2つめは、$@
にエラーメッセージを格納します。evalを使うことによって、
eval{
die 'エラーです'; # 例外が発生
};
if( $@ ){
print "Error: $@\n"; # $@にエラーメッセージが入る
}
なお、try {} catch {}
構文を使って例外処理を書くことができます。
use Try::Tiny;
try {
die 'クリティカルなエラーです';
} catch {
warn "エラーです: $_";
}
擬似シグナル
Perlでは、__
や__
といった疑似シグナルもサポートしています。ここにコードを指定すると、
次のコードを実行すると、die 'foo'
と同様の挙動になります。
local $SIG{__WARN__} = sub { die $_[0] };
warn 'foo';