抱歉这是一个愚蠢的问题,但我是初学者,所以我无法解决这个问题。
我处理文件,其中数据块被不同长度的连续=
符号行分隔,然后是\n
。我想使用$/ = "=+\n";
将这些块作为单独的记录读取,但它不会检测===
分隔符。
所以我的代码是:
$ cat prog1
#!/usr/bin/perl
use v5.22;
use strict;
use warnings;
$/ = "=+\n";
$\="+++\n";
while (<>){
chomp;
print;
}
我的数据:
$ cat data1
line1
line2
===
line4
line5
我的输出:
$ ./prog1 data1
line1
line2
===
line4
line5
+++
答案 0 :(得分:5)
$/
不支持正则表达式。您需要使用===\n
。
你可以使用正则表达式伪造 - chomp
使用正则表达式。
#!/usr/bin/env perl
use strict;
use warnings;
$/ = "=\n";
$\="+++\n";
while (<>){
s/^=+\n\z//gm;
print;
}
请参阅:perlvar:
$ /的值是字符串,而不是正则表达式。
答案 1 :(得分:2)
如果文件足够短,请将其加载到内存中并拆分到您想要的任何记录结束指示符:
local $/;
my @lines = split /=+\n|\++\n/, <>;
foreach my $line (@lines) { ... }
如果重要的是记录分隔符(例如,如果您需要区分以===\n
结尾的记录与以+++\n
结尾的记录),请捕获记录分隔符
local $/;
my @lines = split /(=+\n|\++\n)/, <>;
while (my $line = shift @lines) {
my $record_separator = shift @lines;
...
}