Аргумент функции 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 ответ:
eq
всегда возвращает true или false, но=~
(когда в контексте списка) возвращает "список, состоящий из подвыражений, соответствующих скобкам в шаблоне".Когда вы помещаете список внутри другого списка (например, список совпадений внутри списка аргументов подпрограммы), они объединяются.
Если есть 0 совпадений, вы получаете 2 других аргумента в списке.
Если есть 2 совпадения, вы получаете эти 2 совпадения, а затем 2 других аргумента в общей сложности 4 аргументы.
Ваш код зависит от наличия ровно трех аргументов.