Perl + определить, является ли param пустым значением из ARG - PullRequest
2 голосов
/ 27 июля 2010

когда я запускаю следующий скрипт script.pl без аргументов:

./script.pl

Я не получаю сообщение No arg. Зачем? Как определить, является ли $param нулевым или пустым значением, таким же, как [ -z из ksh?

#!/usr/bin/perl
my $param = $ARGV[0];
if ($param = "") {
    print No arg;
} else {
    print arg: $param;
}

Ответы [ 5 ]

9 голосов
/ 27 июля 2010

Потому что это не Perl. Где вы узнали этот синтаксис? Так много с этим не так.

  1. $param = "" назначает пустую строку для $param, это не то, что вы хотите.

  2. Ноль пишется undef в Perl.

  3. Для сравнения строк используйте оператор eq .

  4. Вы должны указать строки: print "No arg"

Намного проще:

#!/usr/bin/perl
if (@ARGV) {
    print 'have parameters';
} else {
    print q{don't have parameters};
}
3 голосов
/ 29 июля 2010

Вот пример, чтобы проиллюстрировать это немного лучше.

if( $#ARGV == -1 ){
    print "No arguments passed.\n";
} else if( $#ARGV == 0 ){
    print "One argument passed.\n";
} else {
    print $#ARGV +1 ."arguments passed.\n";
}

Мне нравится использовать «scalar @ARGV», так как это представляет количество элементов в массиве.Вместо этого $ # ARGV - это индекс последнего элемента в массиве.Вот почему он выключен одним. Если бы $ [(это специальная переменная, которая устанавливает начальный индекс массивов Perl.) Было установлено в 1, а не в 0 (по умолчанию), то $ # ARGV не было бы отключено одним для наших целей.Я бы не стал связываться с $ [так как он глобальный.Изменение может сломать много модулей.

my $argument_count = scalar @ARGV;
if( $argument_count == 0 ){
    print "No arguments passed.\n";
} else if( $argument_count == 1 ){
    print "One argument passed.\n";
} else {
    print "$argument_count arguments passed.\n";
}
2 голосов
/ 28 июля 2010

Хорошо, похоже, что мой предыдущий ответ оказался ошибочным, так что вот еще одна попытка, прямо на этот раз.

Тест, который вы ищете: defined:

my $param = $ARGV[0];
if (defined $param) {
    print "arg: $param\n";
} else {
    print "No arg\n";
} 

Если для заполнения $ARGV[0] (или других более поздних элементов) было недостаточно параметров, значение в этой позиции будет undef, поэтому тест defined оценивается как ложный.

0 голосов
/ 11 ноября 2017

Вот удобный фрагмент, чтобы сделать скрипт прерванным с ошибкой, если аргументы не переданы:

if (not defined $ARGV[0]) {
    print STDERR "Error: missing parameter. Usage: perl $0 <required-parameter>\n";
    exit 1;
}

(Существуют более компактные и более подробные / надежные способы написания этого, но, как новичок в Perl, я обнаружил, что это предлагает хороший баланс ясности и краткости.)

0 голосов
/ 17 июня 2013

если параметр пуст, вы можете автоматически создать параметр:

$ARGV[0] || 'yourParam';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...