我正在阅读一个文件,我想知道如何跳过具有Unicode NULL的行,U+0000?我已经尝试了下面的所有内容,但都没有效果:
if($line)
chomp($line)
$line =~ s/\s*$//g;
答案 0 :(得分:6)
您的“所有内容”列表似乎不包含明显的$line =~ m/\000/
。
答案 1 :(得分:2)
Perl字符串可以包含任意数据,包括NUL字符。您的if
仅检查true或false(其中""
和"0"
是两个假字符串,其他一切都是真的,包括包含单个NUL“\ x00”的字符串)。您的chomp
仅删除行分隔符,而不是NUL。 NUL字符不是空格,因此不匹配\s
。
您可以使用八进制或十六进制表示法(分别为"\000"
或"\x00"
)在正则表达式中指定NUL字符,从而显式匹配NUL字符。
答案 2 :(得分:2)
因为您询问了Unicode NULL(在UTF-8中编码时与ASCII NUL相同),所以让我们使用perlunicode documentation中描述的\N{U+...}
表格。
也可以使用
\N{U+...}
表示法将Unicode字符添加到字符串中。所需字符的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 line 1 last