# Perlの制御構文 {{tag: perl}} ## if unless while until for {{toc 3-}} ### 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