Операция eval может выдавать либо ошибки, либо предупреждения.Сообщения об ошибках от eval хранятся в переменной $ @.Если не было выдано никакой ошибки, $ @ будет пустой строкой.Однако предупреждающие сообщения не сохраняются в переменной $ @.Вы можете обработать предупреждения, используя $SIG{__WARN__}
.
Я думаю, что в вашем случае eval выдает предупреждения.Один из способов справиться с этим - сделать что-то вроде этого:
#!/usr/bin/perl
use warnings;
use strict;
BEGIN { $SIG{'__WARN__'} = sub { error ($_[0]); }}
my $good_hash = "( 1 => 'one', 2 => 'two')";
my $bad_hash = "[ 1 => 'one', 2 => 'two')";
eval{my %string = eval($good_hash)}; error($@) if ($@);
eval{my %string = eval($bad_hash)}; error($@) if ($@);
# sub error will be called both in case of errors and warning.
sub error
{
my ($msg ) = @_;
print "Error/ warning message - $msg\n";
}
Это пример упрощенного кода, который можно улучшить в зависимости от ваших требований.