Perlの制御構文
if unless while until for
if
単純な例
if (条件) {
# 条件が真ならここが実行される
}
if else
if (条件) {
# 条件が真ならここが実行される
}
else {
# 条件が偽ならここが実行される
}
if elsif
if (条件) {
# 条件が真ならここが実行される
}
elsif (条件B) {
# 条件Bが真ならここが実行される
}
if elsif else
if (条件A) {
# 条件Aが真ならここが実行される
}
elsif (条件B) {
# 条件Bが真ならここが実行される
}
else {
# 条件A/B ともに偽ならここが実行される
}
unless
unless
unless (条件) {
# 条件が偽ならここが実行される
}
unless else
unless (条件) {
# 条件が偽ならここが実行される
}
else {
# 条件が真ならここが実行される
}
あまり書かないかもしれませんが、以下のようにも書けます。
unless (条件) {
# 条件が偽ならここが実行される
}
elsif (条件B) {
# 条件Bが真ならここが実行される
}
「elsunless」とは書けません。
if / unless
if と unless は、条件を逆にすれば、等価な制御構文になります。
my $foo = 'bar';
if ($foo eq 'bar') {
print "true"; # 出力される
}
unless ($foo ne 'bar') {
print "false"; # 出力される
}
unless の条件に否定だったり、unless の条件を複数にすると、わりと読みにくくなります(おそらく慣れの問題ですが)。
my $foo = 'bar';
unless (!$foo && $foo ne 'baz' || $foo eq 'hoge') {
# orz
}
個人的には、unless は 条件がひとつだけのときしか使わないようにしてます。
while
while は条件が成立する間、つづくブロックを繰り返し処理します。
while (条件) {
# 条件が成立する間、
# ここが実行される
}
以下のようにすると、無限ループになります。
while (1) {
# last; しない限りはここが実行され続ける
}
until
until は while と逆で、条件が成立しない間、あとに続くブロックを繰り返し実行します。
until (条件) {
# 条件が成立しない間、
# ここが実行される
}
条件式のコンテキスト
if / unless / while / until の (条件) は、スカラーコンテキストで評価されます。
my @list = ();
if (@list) {
print "foo"; # 出力されない
}
my @list2 = ('');
if (@list2) {
print "foo"; # 出力される
}
できれば明示的にした方が読みやすいと思います。
my @list = ('');
if (scalar @list > 0) {
print "foo"; # 要素があるときに出力
}
for
Perl においてループは for を使います。for と foreach に違いはありません。どちらも同じように書けますが、このところはめっきり foreach を見かけません。
my @list = qw/foo bar baz/;
for my $str ( @list ) {
print "$str\n";
}
for ( my $i = 0; $i < 10; $i++ ) {
print "$i\n";
}
for (1..5) {
print "$_\n";
}
SEE ALSO
- perldoc perlintro
- perldoc perlsyn