Regex 我的perl正则表达式有什么问题

Regex 我的perl正则表达式有什么问题,regex,perl,shell,unix,Regex,Perl,Shell,Unix,我试图在文本文件中查找错误记录: 文件中数据的格式为: somedata\x1Fsomemoredata\x1F\n somedata2\x1Fsomemoredata2\x1F\n \x1F是十六进制值的单位分隔符,该数据在另一个脚本中使用Perl的chr31(单位分隔符的ascii代码)写入 我用perl编写了这篇文章: ## the format of each record in the file: alphanumericdata\x1Falphanumericdata\x1F\n

我试图在文本文件中查找错误记录:

文件中数据的格式为:

somedata\x1Fsomemoredata\x1F\n
somedata2\x1Fsomemoredata2\x1F\n
\x1F是十六进制值的单位分隔符,该数据在另一个脚本中使用Perl的chr31(单位分隔符的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;
这会打印每一行,但我知道大多数行的格式都是正确的,所以我的正则表达式有问题

我在这里犯了一些noob错误吗???

您想要的是qr,这是存储正则表达式的正确方法:

my $regex = qr([A-z0-9]+\x1F[A-z0-9]+\x1F\n$);
您需要的是qr,这是存储正则表达式的正确方法:

my $regex = qr([A-z0-9]+\x1F[A-z0-9]+\x1F\n$);

问题是您在模式中包含了Perl匹配运算符Perl代码

my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

if ($row !~ m/$pat/)
if ($row !~ /$pat/)   # shortcut
if ($row !~ $pat)     # shortcut
将模式硬编码为字符串文字是没有意义的,所以让我们假设$pat正在从文件中读取。在这种情况下,您需要预编译它

# Pretend we're reading  ^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z  from a file.
my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

my $re = qr/$pat/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut
如果您要硬编码一个文件,您会直接使用qr//命令。它可以让你从一堆斜杠中解脱出来

my $re = qr/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut
在这种情况下,似乎没有理由提前指定模式。您可以在匹配运算符中指定right

if ($row !~ m/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)
if ($row !~ /^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)   # same

问题是您在模式中包含了Perl匹配运算符Perl代码

my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

if ($row !~ m/$pat/)
if ($row !~ /$pat/)   # shortcut
if ($row !~ $pat)     # shortcut
将模式硬编码为字符串文字是没有意义的,所以让我们假设$pat正在从文件中读取。在这种情况下,您需要预编译它

# Pretend we're reading  ^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z  from a file.
my $pat = "^[A-z0-9]+\\x1F[A-z0-9]+\\x1F\\n\\z";

my $re = qr/$pat/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut
如果您要硬编码一个文件,您会直接使用qr//命令。它可以让你从一堆斜杠中解脱出来

my $re = qr/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/;

if ($row !~ m/$re/)
if ($row !~ /$re/)   # shortcut
if ($row !~ $re)     # shortcut
在这种情况下,似乎没有理由提前指定模式。您可以在匹配运算符中指定right

if ($row !~ m/^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)
if ($row !~ /^[A-z0-9]+\x1F[A-z0-9]+\x1F\n\z/)   # same

文本中的字符\,x,1,F是4个字符,还是仅仅是一个单字节十六进制代码的转义表示,例如0x1F=decimal 37?通过尝试将正则表达式存储为双引号字符串,您是否会给自己带来不必要的困难?使用qr-这就是它的用途。文本没有文字字符\,x,1,F。。这只是@marcbd中单位分隔符的一种表示形式。你的文本中是否有字符\,x,1,F,4个字符,或者,这仅仅是一个单字节十六进制代码的转义表示,例如0x1F=decimal 37?通过尝试将正则表达式存储为双引号字符串,您是否会给自己带来不必要的困难?使用qr-这就是它的用途。文本没有文字字符\,x,1,F。。这只是@MarcB中单位分隔符的表示