- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试改进 Encode::decode()
发出的警告消息.而不是打印模块的名称和模块中的行号,我希望它打印正在读取的文件的名称以及该文件中找到格式错误的数据的行号。对于开发人员来说,原始消息可能很有用,但对于不熟悉 Perl 的最终用户来说,它可能毫无意义。最终用户可能更想知道是哪个文件出现了问题。
我首先尝试使用 $SIG{__WARN__}
来解决这个问题。处理程序(这可能不是一个好主意),但我得到了一个段错误。可能是一个愚蠢的错误,但我无法弄清楚:
#! /usr/bin/env perl
use feature qw(say);
use strict;
use warnings;
use Encode ();
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
my $fn = 'test.txt';
write_test_file( $fn );
# Try to improve the Encode::FB_WARN fallback warning message :
#
# utf8 "\xE5" does not map to Unicode at <module_name> line xx
#
# Rather we would like the warning to print the filename and the line number:
#
# utf8 "\xE5" does not map to Unicode at line xx of file <filename>.
my $str = '';
open ( my $fh, "<:encoding(utf-8)", $fn ) or die "Could not open file '$fn': $!";
{
local $SIG{__WARN__} = sub { my_warn_handler( $fn, $_[0] ) };
$str = do { local $/; <$fh> };
}
close $fh;
say "Read string: '$str'";
sub my_warn_handler {
my ( $fn, $msg ) = @_;
if ( $msg =~ /\Qdoes not map to Unicode\E/ ) {
recover_line_number_and_char_pos( $fn, $msg );
}
else {
warn $msg;
}
}
sub recover_line_number_and_char_pos {
my ( $fn, $err_msg ) = @_;
chomp $err_msg;
$err_msg =~ s/(line \d+)\.$/$1/; # Remove period at end of sentence.
open ( $fh, "<:raw", $fn ) or die "Could not open file '$fn': $!";
my $raw_data = do { local $/; <$fh> };
close $fh;
my $str = Encode::decode( 'utf-8', $raw_data, Encode::FB_QUIET );
my ($header, $last_line) = $str =~ /^(.*\n)([^\n]*)$/s;
my $line_no = $str =~ tr/\n//;
++$line_no;
my $pos = ( length $last_line ) + 1;
warn "$err_msg, in file '$fn' (line: $line_no, pos: $pos)\n";
}
sub write_test_file {
my ( $fn ) = @_;
my $bytes = "Hello\nA\x{E5}\x{61}"; # 2 lines ending in iso 8859-1: åa
open ( my $fh, '>:raw', $fn ) or die "Could not open file '$fn': $!";
print $fh $bytes;
close $fh;
}
utf8 "\xE5" does not map to Unicode at ./p.pl line 27
, in file 'test.txt' (line: 2, pos: 2)
Segmentation fault (core dumped)
最佳答案
这是另一种定位警告触发位置的方法,未缓冲 sysread
use warnings;
use strict;
binmode STDOUT, ':utf8';
binmode STDERR, ':utf8';
my $file = 'test.txt';
open my $fh, "<:encoding(UTF-8)", $file or die "Can't open $file: $!";
$SIG{__WARN__} = sub { print "\t==> WARN: @_" };
my $char_cnt = 0;
my $char;
while (sysread($fh, $char, 1)) {
++$char_cnt;
print "$char ($char_cnt)\n";
}
test.txt
是由发布的程序编写的,除了我必须添加到它来重现行为——它在 v5.10 和 v5.16 上运行时没有警告。我添加了
\x{234234}
到最后。可以使用
$char =~ /\n/
跟踪行号.
sysread
返回
undef
关于错误。可以移动到
while (1)
的正文中允许读取继续并捕获所有警告,在
0
上爆发(在 EOF 上返回)。
Encode
重新读取文件可能比到达
sysread
更好, 特别是如果
sysread
使用
Encode
.
utf8
在内部,我不确定
sysread
需要
Encode
.
Note that if the filehandle has been marked as
:utf8
Unicode characters are read instead of bytes (the LENGTH, OFFSET, and the return value ofsysread
are in Unicode characters). The:encoding(...)
layer implicitly introduces the:utf8
layer. Seebinmode
,open
, and theopen
pragma.
sysread
不支持编码层 .上面的链接,虽然对于旧版本(一个是 v5.10)确实显示了引用的内容,但新版本告诉我们会有异常(exception)。
关于perl - 尝试改进 Encode::decode 警告消息:$SIG{__WARN__} 处理程序中的 Segfault,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41360900/
我试图在字符串中显示 sig figs,我找到了 '{:.2f}'.format(x) 样式,只要我有sig figs 在代码中作为整数,但如果 sig figs 的数量包含在变量中,我似乎无法使这种
我创建的脚本有问题。这是我第一次使用信号,因为我希望我的脚本像守护进程一样运行,所以我设置了几个信号处理程序来正确结束我的脚本: local $SIG{HUP} = \&StopSuperviser;
我是 Alloy 新手,由于出现错误,我的程序无法执行或显示。我遇到的错误是 A Syntax error has occurred: You must specify a scope for "th
我在热门编码网站 codechef 上提交名为“Money Transformation”的问题时遇到问题。每次我提交解决方案时,我都会收到运行时错误名称 SIG SEGV。经过一些搜索在谷歌上我发现
Sorbet 显示 attr_reader 错误,但如果我错了请纠正我,当函数被声明而不是被调用时需要 sigs,对吧? 我已经尝试过阅读文档,但我得到的只是这个注释 注意:许多看起来像局部变量的 R
我们有一个关于 XML-sig 的问题,需要有关可选元素以及一些规范化和转换内容的详细信息。我们正在为一个非常小的 XML 语法负载编写规范,它将进入媒体文件的元数据,并且需要通过加密签名。我们认为我
我正在尝试在我的 Perl 程序中添加一个捕获信号。当 ctrl+C 发生时,我想要一条确认消息和一个用户输入( Y 或 N )。 Y 输入工作正常。 如果用户输入 N,那么基本上我想“取消” ctr
这个问题在这里已经有了答案: How does function application with the $ operator curry in Haskell? (1 个回答) 8年前关闭。 如果
这些设置之间有什么区别? $SIG{CHLD} = 'IGNORE' $SIG{CHLD} = 'DEFAULT' $SIG{CHLD} = '' $SIG{CHLD} = undef 根据“U
我有一段 Perl 代码,有点像下面这样(强烈简化): 有一些嵌套的子程序调用(实际上是方法),并且一些内部的执行它们自己的异常处理: sub outer { middle() } sub middl
最近尝试更新 emacs 软件包并得到了这个。 Failed to verify signature archive-contents.sig: No public key for 066DAFCB8
我正在使用带有grails安全性和JA-SIG CAS spring安全性插件的grails。 解决此问题的一种方法是登录到CAS服务器并重新启动应用程序。 另一种方法是,如果我通过同一CAS服务器登
因此,当我尝试传递对象 Map> 时,我的代码显示编译器错误到 Map> 的方法。如下... private static void logProgress(Map>> cacheLoaders, M
我创建了一个信号处理程序,以便在发送 SIGSEGV 时调用。我使用 C 语言编写程序,还使用 Linux 和 intel x86 处理器。在 sig 处理程序中,看起来通过 siginfo_t
我知道,通常你会告诉我检查日志(在崩溃之前,看看我是否遗漏了什么)。 .没什么,因为当我尝试开始一项新 Activity 时,应用程序无论如何都会崩溃。仅有的两个有效 Activity 是 Splas
我对如何正确关闭我正在使用的非常简单的服务器感到困惑。 我在想这应该够了: #!/usr/bin/python import signal import myhandler import Socket
我最近注意到,当使用 utf-8-sig 编码附加到文件时,Python 的行为方式并不明显。见下文: >>> import codecs, os >>> os.path.isfile('123')
我对shell 脚本编写 和Perl 很陌生,我正在尝试将Perl 脚本转换为Python脚本。 我遇到了下面的代码片段,但我并不清楚。 sub sigalrm_handler { printf
我正在构建一个使用蓝牙与远程传感器通信的 iPhone 应用程序。外设是蓝牙自行车速度传感器。该应用程序使用来自外围设备的信息来计算行驶距离。 我看到有一个蓝牙特别兴趣小组 (SIG) 负责确保制造商
我知道 .asc签名作为文本文件输出,而 .sig & .gpg是二进制的。 一边说: 是 .sig和 .gpg同一个文件有不同的扩展名?如果没有,为什么要使用一个? 文本文件和二进制文件,有什么相对
我是一名优秀的程序员,十分优秀!