switch文


 バージョン5.10以降ではgivenを使うとswitch相当のことができます。
use strict;
use warnings;
use feature ':5.10';

my $val = 'def';

# 文字列
given ($val) {
    when ('abc') {
        say "1";
    }
    when ('def') {
        say "2";
    }
    when ('ghi') {
        say "3";
    }
    default {
        say "0";
    }
}

# 正規表現
given ($val) {
    when (/^abc$/) {
        say "1";
    }
    when (/^def$/) {
        say "2";
    }
    when (/^ghi$/) {
        say "3";
    }
    default {
        say "0";
    }
}

my $num = 88;

# リスト
given ($num) {
    when ([90..100]) { say "A" }
    when ([80..89])  { say "B" }
    when ([60..79])  { say "C" }
    default          { say "D" }
}

# 関数
given ($num) {
    when (sub { $_[0] >= 90 }) { say "A" }
    when (sub { $_[0] >= 80 }) { say "B" }
    when (sub { $_[0] >= 60 }) { say "C" }
    default                    { say "D" }
}

# デフォルト変数
given ($num) {
    when ($_ >= 90) { say "A" }
    when ($_ >= 80) { say "B" }
    when ($_ >= 60) { say "C" }
    default         { say "D" }
}
 Switchモジュールを使う方法もあります。
use strict;
use warnings;
use Switch '__'; # 高階関数を使わない場合 use Switch;

my $val = 'def';

# 文字列
switch ($val) {
    case 'abc' { print "1\n"; }
    case 'def' { print "2\n"; }
    case 'ghi' { print "3\n"; }
    else       { print "0\n"; }
}

# 正規表現
switch ($val) {
    case /^abc$/ { print "1\n"; }
    case /^def$/ { print "2\n"; }
    case /^ghi$/ { print "3\n"; }
    else         { print "0\n"; }
}

my $num = 88;

# リスト
switch ($num) {
    case [90..100] { print "A\n" }
    case [80..89]  { print "B\n" }
    case [60..79]  { print "C\n" }
    else           { print "D\n" }
}

# 関数
switch ($num) {
    case (sub { $_[0] >= 90 }) { print "A\n" }
    case (sub { $_[0] >= 80 }) { print "B\n" }
    case (sub { $_[0] >= 60 }) { print "C\n" }
    else                       { print "D\n" }
}

# 高階関数
switch ($num) {
    case __ >= 90 { print "A\n" }
    case __ >= 80 { print "B\n" }
    case __ >= 60 { print "C\n" }
    else          { print "D\n" }
}
 Switchモジュールを使わない方法もあります。
use strict;
use warnings;

my $val = 'def';

$_ = $val;
SWITCH: {
    /^abc$/ && do { print "1\n"; last SWITCH; };
    /^def$/ && do { print "2\n"; last SWITCH; };
    /^ghi$/ && do { print "3\n"; last SWITCH; };
    print "0\n";
}

関連項目

if文