如何在出现"Wide character in print at X line Y"消息后立即退出Perl程序?



我有一个Perl程序,它给了我以下输出:

Wide character in print at foo.pl line 139, <FILE> line 1.
Wide character in print at foo.pl line 139, <FILE> line 2.
Wide character in print at foo.pl line 139, <FILE> line 3.

因为我不想添加:utf8层,也不想关闭警告,所以如果出现上述消息,我正在寻找一种方法来终止程序并使用错误代码退出。

由于print语句是抛出错误的语句,我试图在print语句旁边使用or die,但这没有帮助。例如:>

print OUTPUT $_."n" or die "Something wrong happened - $!";

我想这是不工作,因为print不是真的失败-它只是显示一个消息。

你要找的是:

use warnings FATAL => 'utf8';

这将导致任何"宽字符"警告是致命的,并导致Perl进程死亡。

例如:

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use feature 'say';
for (1 .. 3) {
    say "παν γράμμα";
}
say "=" x 80;
use warnings FATAL => 'utf8';
for (1 .. 3) {
    say "παν γράμμα";
}

输出:

alex@kyon:~$ ./fatal_wide.pl
Wide character in say at ./fatal_wide.pl line 9.
παν γράμμα
Wide character in say at ./fatal_wide.pl line 9.
παν γράμμα
Wide character in say at ./fatal_wide.pl line 9.
παν γράμμα
================================================================================
Wide character in say at ./fatal_wide.pl line 17.

并以非零退出状态退出:

alex@kyon:~$ echo $?
255

您需要像这样捕获Perl警告:

local $SIG{__WARN__} = sub {
    my $mes = shift;
    die $mes;
};

如果消息匹配,您可以提供自定义warn处理程序,然后die:

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
local $SIG{__WARN__} = sub {
    my $msg = shift;
    die $msg if (index $msg, "Wide character in print") > -1;
    warn $msg;
};
warn "test warn";
print "鸡n";
warn "won't reach";

生产:

test warn at foo.pl line 17.
Wide character in print at foo.pl line 18.

相关内容

最新更新