Perl блок try / catch выдает ошибку в Error.pm - PullRequest
1 голос
/ 16 сентября 2011

У меня есть следующий код в скрипте Perl, который я пишу:

#!/usr/bin/perl
use DBI;
use Getopt::Long;
use Time::HiRes;
use Error qw(:try);

....

my $starttime = Time::HiRes::time;

try {
    my $dbh = DBI->connect("dbi:Sybase:$server", $username, $password);
    $dbh->do("use $database");
    my $query="exec OfflineDatabaseReport";

    $row = $dbh->selectrow_hashref($query);

    $dbh->disconnect();
} catch Error with {
    print "boom";
    exit 1;
};
my $endtime = Time::HiRes::time;
my $timetaken = $endtime - $starttime;

Сценарий работал нормально, пока я не обернул часть доступа к данным в блок try...catch.Теперь я получаю следующее исключение:

Невозможно использовать строку ("1316135985.90893") в качестве ссылки HASH, в то время как "строгие ссылки" используются в /usr/lib/perl5/site_perl/5.8.8 / Error.pm строка 217.

Я попытался установить:

no strict "refs";

Но я все еще получаю ту же ошибку.Я наивен в использовании здесь try/catch блока?

1 Ответ

3 голосов
/ 23 сентября 2011

Вот как парсер видит код:

try({ ... }, catch(Error, with({ ... }, my $endtime = Time::HiRes::time)));

Это означает, что он передает результат установки $endtime в Time::HiRes::time как второй аргумент подпрограммы with BLOCK. Глядя на источник Error.pm, я вижу:

sub with (&;$) {
    @_
}

Что означает with BLOCK,SCALAR - допустимый список аргументов. Все, что он делает, это передает аргументы до catch, что интерпретирует my $endtime = Time::HiRes::time как $clauses. catch само возвращает $clauses, что превращает весь оператор в:

try({ ... }, my $endtime = Time::HiRes::time);

try предполагает, что $clauses является хеш-кодом, как вы можете видеть по вызову

$clauses->{'finally'}->()
    if(defined($clauses->{'finally'}));

Таким образом, Perl пытается использовать значение Time::HiRes::time в качестве хэш-ссылки, что, безусловно, не может, поскольку на самом деле это скаляр со значением «1316135985.90893».

Итак, точка с запятой в конце блока catch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...