2024/02/13 22:13:39

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
サイト内検索