我正在阅读一个文件,并且想知道如何跳过具有 Unicode NULL, U+0000的行?我已经尝试了以下所有方法,但没有一个有效:
if($line)
chomp($line)
$line =~ s/\s*$//g;
您的“一切”列表似乎不包括明显的$line =~ m/\000/
.
Perl 字符串可以包含任意数据,包括 NUL 字符。您if
只检查真假(其中""
和"0"
是两个假字符串,其他一切都为真,包括包含单个 NUL“\x00”的字符串)。您chomp
只删除行分隔符,而不是 NUL。NUL 字符不是空格,因此不匹配\s
。
"\000"
您可以通过使用八进制或十六进制表示法(或"\x00"
分别)在正则表达式中指定它来显式匹配 NUL 字符。
因为您询问了 Unicode NULL(在UTF-8编码时与 ASCII NUL 相同),所以让我们使用perlunicode 文档\N{U+...}
中描述的形式。
Unicode 字符也可以通过使用
\N{U+...}
符号添加到字符串中。所需字符的 Unicode 代码(十六进制)应放在大括号中,位于U
. 例如,笑脸是\N{U+263A}
。
您也可以在正则表达式中进行匹配\N{U+...}
。见下文。
#! /usr/bin/env perl
use strict;
use warnings;
my $contents =
"line 1\n" .
"\N{U+0000}\n" .
"foo\N{U+0000}bar\n" .
"baz\N{U+0000}\n" .
"\N{U+0000}quux\n" .
"last\n";
open my $fh, "<", \$contents or die "$0: open: $!";
while (defined(my $line = <$fh>)) {
next if $line =~ /\N{U+0000}/;
print $line;
}
输出:
$ ./filter-nulls 1号线 最后的