my @banks = @banksDup= ("abs", "qer", "qaz");
my $serverFailedabs;
my $serverFailedqer;
my $serverFailedqaz;
### Some processing of $serverFailedabs, $serverFailedqer and $serverFailedqaz happens here ###
foreach my $bank (@banks) {
if ("$serverFailed${bank}" ne "") ## Line 85
{
print "$bank server setup failed;
@banksDup = grep !/${bank}/, @banksDup;
}
}
Ошибка:
Global symbol "$serverFailed" requires explicit package name at perl1.pl line 85
Здесь "$serverFailed${bank}" рассматривается как $serverFailed на этапе синтаксического анализа и выдает ошибку. Как я могу избежать этой проблемы?
Я хочу, чтобы "$serverFailed${bank}" выполнялся во время выполнения, чтобы "$serverFailed${bank}" получал правильное значение
Для получения дополнительной информации о том, почему этот подход плох и почему рекомендуется использовать хэш, прочитайте это
@GillesQuenot: Сообщество Perl переключилось на то, чтобы называть их «хэшами», когда в 1994 году был выпущен Perl 5.
Я предполагаю, что ОП не знает хеш, поэтому ассоциативный массив - это еще один способ поговорить о хеше. Просто моя мысль. Но да, в Perl это хэш :)
Используйте хэш.
my @banks = ( "abs", "qer", "qaz" );
my @banksDup = @banks;
my %serverFailed = (
abs => '',
qer => '',
qaz => '',
);
for my $bank ( @banks ) {
if ( $serverFailed{$bank} ne "" ) {
print "$bank server setup failed\n";
@banksDup = grep $_ ne $bank, @banksDup;
}
}
Узнайте, как использовать ассоциативный массив вместо тестирования неправильного кода