Что вы подразумеваете под "инициализирован"?Есть значения, которые не являются "undef"?
Для небольшого количества значений прямая проверка, если ИМХО, является наиболее читаемой / поддерживаемой.
if (!$var1 || !$var2 || !$var3) {
print "ERROR: Some are not defined!";
}
Кстати, проверка !$var
возможная ошибка в том, что «0» является ложным в Perl, и, следовательно, строка, инициализированная «0», провалит эту проверку.Гораздо лучше использовать $var eq ""
Или еще лучше, разложить вещи по> 3 значениям
if (!$var1 # Use this if your values are guarantee not to be "0"
|| $var2 eq "" # This is a LOT better since !$var fails on "0" value
|| $var3 eq "") {
print "ERROR: Some are not defined!";
}
Если существует так много значений, чтобы проверить, что вышеприведенное становится трудным для чтения(хотя с проверкой на строку, как во втором примере, это на самом деле никогда не происходит), или, если значения хранятся в массиве , вы можете использовать grep для абстрагирования проверки:
# We use "length" check instead of "$_ eq ''" as per tchrist's comment below
if (grep { length } ($var1, $var2, $var3, $var4, $var5, @more_args) ) {
print "ERROR: Some are not defined!";
}
Если вы должны знать, КАКОЕ из значений не определено, вы можете использовать цикл for (оставленный в качестве очевидного упражнения для читателя) или трюк с картой:
my $i = -1; # we will be pre-incrementing
if (my @undefined_indexes = map { $i++; $_ ? () : $i }
($var1, $var2, $var3, $var4, $var5, @more_args) ) {
print "ERROR: Value # $_ not defined!\n" foreach @undefined_indexes;
}