Perl“= + \ n”作为$ /分隔符

时间:2017-09-26 11:37:48

标签: perl

抱歉这是一个愚蠢的问题,但我是初学者,所以我无法解决这个问题。

我处理文件,其中数据块被不同长度的连续=符号行分隔,然后是\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
+++

2 个答案:

答案 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;
    ...
}