Perl使用字符串而不添加文件名和行号

时间:2018-04-30 05:55:10

标签: perl

是否有一种die在Perl中以$@未被修改的方式?据我所知,die在某些情况下会破坏$@的内容并“抛出”,在非本地转移控制。我只是想做后者。

die是字符串时,如果传递给$@的异常对象是字符串(或undef),则将文件名和行号附加到die

例如,

#!/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 :(得分:5)

perldoc -f die

  

死亡列表

     

die引发了异常。 [...]

     

如果LIST的最后一个元素没有以换行符结尾,则还会打印当前的脚本行号和输入行号(如果有),并提供换行符。

如果您要取消添加文件名和行号,请​​确保您的错误消息以"\n"结尾。

要重新抛出现有例外,您只需使用die $@即可。 $@是一个异常对象(然后它不会被破坏),或者它是一个以"\n"结尾的字符串(因为前一个die将确保添加一个没有人开始)。