Как передать значение инструкции с помощью оператора сравнения, который разрешает undef при сбое?
В общем, Perl не обещает вернуть какое-либо конкретное истинное или ложное значение своим операторам, а <
не является исключением. Если вы хотите, чтобы определенные значения, то вам нужно что-то вроде
$boolean ? $value_for_true : $value_for_false
так
my $wiz = 5 > 6 ? 1 : undef;
Если вы заботитесь только о том, какое значение вы получаете за ложь, вы можете также использовать следующие:
my $wiz = 5 > 6 || undef;
Эти два варианта оказываются эквивалентными, но это не гарантируется.
Возвращаемое значение 5> 6 является UNDEF. Однако, когда я присваиваю значение 5> 6 переменной
Это неправда. Переменной присваивается определенное значение, потому что 5 > 6
оценивается до определенного значения. Хотя Perl не указывает, какое ложное значение оно возвращает из своих операторов, оно обычно возвращает скаляр sv_no
, который является двойным символом, который представляется пустой строкой, когда рассматривается как строка, и ноль, когда рассматривается как число.
$ perl -wE'say "> ", "".(undef)'
Use of uninitialized value in concatenation (.) or string at -e line 1.
>
$ perl -wE'say "> ", "".("")'
>
$ perl -wE'say "> ", "".(0)'
> 0
$ perl -wE'say "> ", "".(5>6)'
> # Behaves as ""
$ perl -wE'say "> ", 0+(undef)'
Use of uninitialized value in addition (+) at -e line 1.
> 0
$ perl -wE'say "> ", 0+("")'
Argument "" isn't numeric in addition (+) at -e line 1.
> 0
$ perl -wE'say "> ", 0+(0)'
> 0
$ perl -wE'say "> ", 0+(5>6)'
> 0 # Behaves as 0
Это не пустая строка, это двойная карта. Он действует как пустая строка, когда используется как строка, и ноль при использовании в качестве числа. См. Http://perldoc.perl.org/perlsyn.html#Truth-and-Falsehood и http://perldoc.perl.org/perlop.html#Relational-Operators – ThisSuitIsBlackNot
Таким образом, чем меньше или больше оператора разрешается до 1 на успешном и «ложном» при неудаче, который является пустой строкой, а не undef. – capser
Я просто вижу, что результат с 5> 6 ничто, или undef. Поэтому, если я назначу результат 5> 6 переменной, вы можете подумать, что результат 5> 6, который не определен, будет назначен для переменной. Однако, назначив это переменной - вы ее определяете. – capser