2011-10-31 130 views
0

我希望这个问题不是太基本 - 我对 perl很没有经验。我的问题:我想读取并处理一个文件块,但大块的 分隔符可能会有所不同。我有一个变量 $文本中的整个文件。作为一个例子:perl:读取并处理大块文件

One 

Two 

BEGIN 

Three 

Four 

END 

Five 

我想通过块逐步通过这个文件。我想读直到下一个 空行并将结果保存(并处理)为一个块,因此“One”和 “Two”将是前两个块。如果新块以 关键字“BEGIN”开头,则我想阅读并处理,直到关键字“END”,因此 块将是“Three \ n Four”。我将如何在Perl中做到这一点?

我已阅读有关“索引”功能,但无法通过我的$文本 步骤。

非常感谢!

回答

3

您可以将输入记录分隔符设置为空字符串以启用“段落”模式。然后使用触发器运算符来处理BEGIN/END之间的范围;例如:

perl -nle '$/="";if (/^BEGIN/../^END/) {print "> $_"} else {print "[ $_ ]"}' myfile 
+0

谢谢你,触发器操作符似乎确实像我正在寻找的东西。我现在的问题是如何在if语句结束时打破循环?因为,据我了解,其他人会永远回归真实? – Thomas

+0

当第一个表达式为真时,范围运算符返回true。直到第二个表达式为真时这仍然是这种情况,然后导致范围运算符返回false。在显示的代码片段中,额外的BEGIN..END序列将按照您所看到的进行处理。如果您使用?BEGIN?..?END?代替/BEGIN/../END/,那么只有第一个“BEGIN-END”块将被匹配。 – JRFerguson

+0

是的,对不起,你是对的。我曾尝试将你的代码放入一个perl脚本中,并将其整个文件连接成一个变量;它与钻石操作员一起工作。 – Thomas