Perl умирает со строкой без добавления имени файла и номера строки - PullRequest
0 голосов
/ 30 апреля 2018

Есть ли способ die использования в Perl таким образом, что $@ не изменяется? Насколько я могу судить, die искажает содержимое $@ при определенных обстоятельствах и "выбрасывает", передавая управление нелокально. Я просто хочу сделать последнее.

Когда die - строка, добавляется имя файла и номер строки к $@, когда объект исключения, переданный в die, является строкой (или undef).

Например,

#!/usr/bin/env perl
# foo.pl
use strict;
use warnings;
use Data::Dumper;

eval { die '1'; };
my $hash_ref = {
    msg => $@,
};

print Dumper($hash_ref);

печать:

$VAR1 = {
          'msg' => '1 at foo.pl line 7.
'
        };

Но если аргумент не является строкой (или undef), он не изменяется.

#!/usr/bin/env perl
# foo2.pl
use strict;
use warnings;
use Data::Dumper;

eval { die ['string-inside-arrayref']; };
my $hash_ref = {
    msg => $@,
};

print Dumper($hash_ref);

Этот фрагмент производит:

$VAR1 = {
          'msg' => [
                     'string-inside-arrayref'
                   ]
        };

1 Ответ

0 голосов
/ 30 апреля 2018

perldoc -f die * * 1004

LIST

die вызывает исключение. [...]

Если последний элемент списка LIST не заканчивается новой строкой, номер текущей строки скрипта и номер строки ввода (если таковые имеются) также выводятся на печать, и предоставляется новая строка.

Если вы хотите запретить добавление имени файла и номера строки, убедитесь, что ваше сообщение об ошибке заканчивается на "\n".

Чтобы сбросить существующее исключение, вы можете просто использовать die $@. Либо $@ является объектом исключения (тогда он все равно не будет поврежден), либо это строка, заканчивающаяся "\n" (потому что предыдущий die обязательно добавит один, если его не было начать с).

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