Perl - Использование неинициализированной ценности?

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

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

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

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

Что я делаю неправильно?

Ответ 1

Просто проверьте, существует ли $ARGV [0]

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

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

Это будет печатать "No FilePath Specified!\n", если не было переданной командной строки.

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

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

if([email protected]){
    print "No FilePath Specified!\n";
}

Ответ 2

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

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

Я уверен, что вы имели в виду это:

my $filePath = $ARGV[0];

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

Ответ 3

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

my $filePath = $ARGV[0] // '';

Ответ 4

EDIT: Как заметил @Andrew, это не то же самое, что и с именем файла "0"

Кроме того, вместо

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

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

if (! $filePath) {...

который выполняет точно такие же