Perl - Использование неинициализированного значения? - PullRequest
10 голосов
/ 20 марта 2011

Так что я пытаюсь запустить этот код ...

my $filePath = $ARGV['0'];
if ($filePath eq ""){
    print "Missing argument!";
}

Он должен проверить первый аргумент командной строки и сказать мне, если он пуст, но он возвращает эту ошибку, и я не могу понять,почему:

Use of uninitialized value $filePath in string eq at program.pl line 19.

Что я делаю не так?

Ответы [ 4 ]

18 голосов
/ 20 марта 2011

Просто проверьте, определено ли значение $ ARGV [0]

#!/usr/bin/perl
use strict;
use warnings;

if(!defined $ARGV[0]){
    print "No FilePath Specified!\n";
}

Будет выведено «FilePath не указан! \ N», если не было пропущено командной строки.

Проблема, с которой вы сталкиваетесь, заключается в том, что вы устанавливаете $ filePath в неопределенное значение. Warnings жалуется, потому что вы попытались сравнить неопределенное значение с "". Warnings считает, что стоит рассказать вам об этом.

Я использовал свой пример, чтобы показать чистый способ проверки, если что-то определено, но технически для этого вы также можете просто сделать:

if(!@ARGV){
    print "No FilePath Specified!\n";
}
9 голосов
/ 20 марта 2011

Пустой и неинициализированный это не одно и то же.Вы можете проверить, инициализируется ли переменная с помощью оператора defined, например:

if ((!defined $filePath) || ($filePath eq "")) {
 # $filePath is either not initialized, or initialized but empty
 ...
}

Я почти уверен, что вы имели в виду следующее:

my $filePath = $ARGV[0];

(без кавычек))

2 голосов
/ 13 марта 2013

Альтернативный ответ - установить значение по умолчанию, если оно не определено:

my $filePath = $ARGV[0] // '';
0 голосов
/ 20 марта 2011

РЕДАКТИРОВАТЬ: Как отметил @Andrew, это не то же самое, так как он потерпит неудачу с именем файла "0"

Также вместо

if ((!) || ($ filePath eq "")) {...

, как писал @Mat.Вы можете использовать более простой

if (! $ filePath) {...

, который делает то же самое

...