2017-09-26 52 views
3

對不起,我是個初學者,所以無法理清這個問題。

我使用的文件塊的數據被連續的=符號不同長度的行分割,其次是\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 
+++ 
+1

[相關Q​​&A](https://stackoverflow.com/q/19159052/133939) – Zaid

+0

謝謝!這正是我想知道的,我會閱讀A. –

回答

5

$/不支持正則表達式。您需要使用===\n

儘管你可以使用正則表達式來僞造chomp

#!/usr/bin/env perl 
use strict; 
use warnings; 


$/ = "=\n"; 
$\="+++\n"; 

while (<>){ 
    s/^=+\n\z//gm; 
    print; 
} 

參見:perlvar

$ /的值是一個字符串,而不是一個正則表達式。

+0

謝謝! 很遺憾,我認爲它可以像awk一樣工作。 也許在一個變量中讀取整個文件比較容易,然後使用'「= + \ n」'作爲分隔符來分割它。 –

+1

@evb取決於文件的大小。 – simbabque

+0

你總是可以一行一行地閱讀,組裝一個緩衝區,並在你輸入正則表達式時'處理'它(並清除它)。但是這種方法似乎可以做你想做的事情,而且更簡單。 – Sobrique

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; 
    ... 
} 
相關問題