, я только что заметил странное поведение perl5 (5.10.0), когда я передал 0 в качестве аргумента командной строки сценарию, который назначает его переменная. Проблема, с которой я столкнулся, заключается в том, что если я задаю переменной значение по умолчанию в моем сценарии, которое больше 0, скажем 1, то я могу передать любое значение, кроме 0, чтобы переопределить значение по умолчанию 1.
Ниже приводится код ' test.pl 'Я использовал:
#!/usr/bin/perl -w
my $x = shift || 1;
print "x is $x\n";
Ниже приведены команды и выходы, когда я его тестировал:
$ ./test.pl 2
x is 2
$ ./test.pl 0
x is 1
Буду признателен, если кто-нибудь сможет пролить свет на это. Спасибо. wwl
Если вы хотите, чтобы $ x
имел значение «1» в случае, если аргумент не указан, используйте это:
my $x = shift // 1;
Из perldoc perlop:
«//» точно такое же как "||", за исключением того, что он проверяет определенность левой части вместо ее правда.
Примечание: оператор defined-or доступен начиная с версии 5.10 (выпущен 18 декабря 2007 г.)
Лучшим подходом является тот, который указан в ответах Евгения и Александра, но если вы застряли на более старом perl, используйте
my $x = shift;
$x = 1 unless defined $x;
Потому что у вас есть единственный необязательный аргумент, вы можете проверить @ARGV
в скалярном контексте, чтобы проверить, сколько аргументов командной строки присутствует. Если он там есть, используйте его или иным образом вернитесь к значениям по умолчанию:
my $x = @ARGV ? shift : 1;
используйте оператор defined-or, поскольку строка «0» определена, но не оценивается как истина.
#!/usr/bin/perl -w
my $x = shift // 1;
print "x is $x\n";
В этой строке мой $ x = shift || 1;
сдвиг не прошел проверку, и поэтому было выполнено условное логическое ИЛИ ||
и ему было присвоено 1 ... согласно странице на shift значение было 0 что подразумевает пустой массив ....
Выражение shift || 1
выбирает rhs тогда и только тогда, когда lhs оценивается как "false". Поскольку вы передаете 0, который оценивается как «ложь», $ x
заканчивается значением 1.