関数順 インデックス
目的別 インデックス

構文
 
 eval 実行内容1(EXPR形式)
 eval {実行内容2}(BLOCK形式)

返り値
 
 実行内容を内部で実行し,内部で最後に評価された値

説明

  • 実行内容を内部で実行します。構文エラーや実行時エラーが発生した場合には未定義値を返し,$@にエラー・メッセージを設定します。このため,例外処理を記述する際に利用されます(例外処理についてはdieの項にもう少し詳しいサンプルがあります)。
  • EXPR形式の場合,実行内容1の結果をPerlプログラムとして実行します。evalを実行するたびに実行内容1が評価されます。外部からの入力を実行すると,「不正なプログラムの実行につながるので注意して下さい。
  • BLOCK形式の場合,実行内容2をPerlプログラムとして実行します。コンパイル時に実行内容2の内容がパースされます。

使用例

1+2+3をEXPR形式とBLOCK形式でevalした時の動作の違いを見る
#!/usr/bin/perl
use strict;
use warnings;

my $expr = '1+2+3';

my $ret1 = eval $expr;     # EXPR形式(1+2+3を実行する)
my $ret2 = eval { $expr }; # BLOCK形式($exprを実行する)

print $ret1, "\n"; # 6
print $ret2, "\n"; # 1+2+3
1+2+3, 1+2-3, (1+2)*3, int(7/3)を計算する(evalのEXPR形式を使用)
#!/usr/bin/perl
use strict;
use warnings;

my @items = qw(
  1+2+3
  1+2-3
  (1+2)*3
  int(7/3)
);

foreach my $item (@items) {
  printf "%s=%s\n", $item, eval $item;
}
ファイルdummyfileを内容を出力する。ファイルが開けない場合に自分でエラー処理を行う(evalのBLOCK形式を使用)
#!/usr/bin/perl
use strict;
use warnings;

eval {
  my $filename = 'dummyfile';
  open my $fh, "<", $filename or die "$!:$filename";
  print <$fh>;
  close $fh;
};
if ($@) {
  print "Error!\n";
  print $@;
  exit 1;
}
exit 0;