проблема с передачей 0 в качестве аргумента командной строки

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

9
задан Wayne 18 August 2010 в 13:09
поделиться

5 ответов

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

my $x = shift // 1;  

Из perldoc perlop:

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

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

15
ответ дан 4 December 2019 в 07:13
поделиться

Лучшим подходом является тот, который указан в ответах Евгения и Александра, но если вы застряли на более старом perl, используйте

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

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

my $x = @ARGV ? shift : 1;
6
ответ дан 4 December 2019 в 07:13
поделиться

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

#!/usr/bin/perl -w  
my $x = shift // 1;  
print "x is $x\n";  
3
ответ дан 4 December 2019 в 07:13
поделиться

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

0
ответ дан 4 December 2019 в 07:13
поделиться

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

7
ответ дан 4 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: