Аргумент функции Perl исчезает. Почему?


Я создаю стресс-систему в 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");

Он ломается, когда регулярное выражение не находит совпадения. На самом деле это тогда эквивалентно check("good type", "bad type"). Я использую только $_[0], $_[1] и т.д. в функции check (), и это не похоже на то, что у меня был '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];
}
1 2

1 ответ:

eq всегда возвращает true или false, но =~ (когда в контексте списка) возвращает "список, состоящий из подвыражений, соответствующих скобкам в шаблоне".

Когда вы помещаете список внутри другого списка (например, список совпадений внутри списка аргументов подпрограммы), они объединяются.

Если есть 0 совпадений, вы получаете 2 других аргумента в списке.

Если есть 2 совпадения, вы получаете эти 2 совпадения, а затем 2 других аргумента в общей сложности 4 аргументы.

Ваш код зависит от наличия ровно трех аргументов.