【发布时间】:2014-08-26 04:43:52
【问题描述】:
我正在尝试在文本文件中查找不良记录:
文件中数据的格式为:
somedata\x1Fsomemoredata\x1F\n
somedata2\x1Fsomemoredata2\x1F\n
(\x1F 是十六进制值的单位分隔符,这个数据是使用 Perl 的 chr(31) 写在另一个脚本中的,这是单位分隔符的 ascii 码)
我在 perl 中写过:
## the format of each record in the file: alphanumericdata\x1Falphanumericdata\x1F\n
my $regex = "/[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\$/";
print $regex;
#### just opening file
my $filename = "data.txt";
open(my $fh, "<:encoding(UTF-8)", $filename)
or die "Could not open file '$filename' $!";
### reading file line by line
while (my $row = <$fh>) {
## if line does not match format, print the culprit!!!
if($row !~ $regex) {
print $row;
}
}
close $fh;
这会打印每一行,但我知道大多数行的格式都正确,所以我的正则表达式有些问题。
我在这里犯了一些菜鸟错误吗??
【问题讨论】:
-
您的文本中是否真的有字符
\、x、1、F(4 个字符),或者这只是一个单个字节的转义表示十六进制代码(例如 0x1F = 十进制 37)? -
您是否通过尝试将正则表达式存储为双引号字符串而使事情变得不必要地困难?使用
qr()——这就是它的用途。 -
文本没有文字字符 \,x,1,F.. 这只是来自 ASCII table@MarcB 的 UNIT 分隔符的表示