1

我正在阅读一个文件,并且想知道如何跳过具有 Unicode NULL, U+0000的行?我已经尝试了以下所有方法,但没有一个有效:

  • if($line)
  • chomp($line)
  • $line =~ s/\s*$//g;
4

3 回答 3

6

您的“一切”列表似乎不包括明显的$line =~ m/\000/.

于 2013-03-04T21:33:19.480 回答
2

Perl 字符串可以包含任意数据,包括 NUL 字符。您if只检查真假(其中"""0"是两个假字符串,其他一切都为真,包括包含单个 NUL“\x00”的字符串)。您chomp只删除行分隔符,而不是 NUL。NUL 字符不是空格,因此不匹配\s

"\000"您可以通过使用八进制或十六进制表示法(或"\x00"分别)在正则表达式中指定它来显式匹配 NUL 字符。

于 2013-03-04T22:04:41.513 回答
2

因为您询问了 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号线
最后的
于 2013-03-04T22:29:54.797 回答