проблема с передачей 0 в качестве аргумента командной строки - PullRequest
9 голосов
/ 18 августа 2010

Я только что заметил странное поведение 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

Ответы [ 5 ]

15 голосов
/ 18 августа 2010

Если вы хотите, чтобы $x имел значение «1», если аргумент не указан, используйте это:

my $x = shift // 1;  

От perldoc perlop:

"// "в точности совпадает с" || ", за исключением того, что он проверяет определенность левой части вместо ее истинности.

Примечание: оператор определенного-или доступен, начиная с 5.10 (выпущен18 декабря 2007 г.)

7 голосов
/ 18 августа 2010

Выражение shift || 1 выбирает rhs, если lhs оценивается как «false». Поскольку вы передаете 0, что означает «ложь», $x заканчивается значением 1.

6 голосов
/ 18 августа 2010

Наилучшим подходом является ответ в ответах Юджина и Александра, но если вы застряли со старым perl, используйте

my $x = shift;
$x = 1 unless defined $x;

Поскольку у вас есть один необязательный аргумент, вы можете проверить @ARGVв скалярном контексте, чтобы проверить, сколько аргументов командной строки присутствуют.Если он есть, используйте его или используйте другой вариант по умолчанию:

my $x = @ARGV ? shift : 1;
3 голосов
/ 18 августа 2010

использовать оператор «определенный или», поскольку строка «0» определена, но не оценена как истинная.

#!/usr/bin/perl -w  
my $x = shift // 1;  
print "x is $x\n";  
0 голосов
/ 18 августа 2010

В этой строке my $x = shift || 1; сдвиг не прошел тест, и поэтому было выполнено условное логическое ИЛИ || и ему присвоено 1 ... согласно странице на смещение значение было 0, которое подразумевает пустой массив ....

...