如何省略包含Unicode NULL(U + 0000)的行?

时间:2013-03-04 21:28:44

标签: regex perl unicode null nul

我正在阅读一个文件,我想知道如何跳过具有Unicode NULL的行,U+0000?我已经尝试了下面的所有内容,但都没有效果:

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

3 个答案:

答案 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