2

学生のプログラミング課題を修正するためのストレス システムを Perl で構築しています。check(<boolean>,<congrats-message>,<blame-message>)途中で役立つはずの関数を作成しました。

として呼び出すと

check(get_option('content-type') eq "text/html","good type", "bad type");

すべて順調。でも、あえてやるなら

check(get_option('content-type') =~ m:text/html:i, "good type", "bad type");

正規表現が一致しないと壊れます。実際には a と同等check("good type", "bad type")です。$_[0]私は check() 関数で$_[1]などのみを使用していますが、最初の引数として 'undef' を持っていたわけではありません: でバグを実際にキャッチできますdie unless $#_ == 2

何が起こっていますか ?私はそれを回避しました

check((get_option('content-type') =~ m:text/html:i && 1), "good type", "bad type");

しかし、この奇妙な状況の原因と理由を理解したいと思っています。

--

sub check {
  if ($_[0]) {
    $okay++;
    print STDERR "^_^ $_[1] ($okay)\n";
  } else {
    print STDERR ">_< $_[2]\n";
  }
  return $_[0];
}
4

1 に答える 1

6

eqは常に true または false を返しますが、=~(リスト コンテキストの場合) 「パターン内の括弧に一致する部分式で構成されるリスト」を返します。

リストを別のリストの中に入れると (例えば、サブルーチンへの引数のリストの中にある一致のリスト)、それらはマージされます。

一致するものが 0 件ある場合は、リスト内の他の 2 つの引数を取得します。

2 つの一致がある場合、それらの 2 つの一致を取得し、次に他の 2 つの引数を取得して合計 4 つの引数を取得します。

コードは、正確に 3 つの引数があることに依存します。

于 2012-06-21T12:43:27.383 に答える