Perl:如何从特定模式开始逐字读取文本文件?

标签 perl parsing

我正在尝试编写一个脚本来读取以空格分隔的文本文件并识别特定模式 PATTERN。识别 PATTERN 后,脚本应读取 RANDOM_NUMBER 个以 PATTERN 开头的单词。例如,假设 PATTERNa 并且 RANDOM_NUMBER7。然后对于这个文本文件:

1 2 3 4 5 6
a b c d e f 
g h i j k j

我想得到:

a b c d e f
g

作为输出。

到目前为止,我已经到了识别这些模式的地步,但我不知道之后如何处理它。阅读单词的最佳方式是什么?

顺便说一句,我看过Read text file in Perl word by word instead of line by line这对我的目的来说有点太模糊了。此外,答案并未就代码的作用提供太多解释。

最佳答案

好的,所以这里的技巧是设置 $/ - 记录分隔符。如果我们将它设置为 ' ',我们可以一次迭代一个“单词”。

然后我们可以使用范围运算符来“检测”我们是否在我们的模式之间。

local $/ = ' ';

while ( <DATA> ) {
    if ( m/a/ ..  10 ) { print; }
}

现在,这会将 from a 打印到“field 10”——这不是特别有用,因为“count”从文件的开头开始。 (由

因此,我们可能希望在看到的条件为真时“触发”,并继续进行其他多次迭代:

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

local $/ = ' ';

while (<DATA>) {
    if (m/a/) {
        print;
        for ( 2 .. 7 ) { print scalar <DATA>; } #2 because we already have "1"
        last; #assuming we only want to do this once. 
    }
}


__DATA__
1 2 3 4 5 6 
a b c d e f 
g h i j k j

打印:

a b c d e f 
g 

关于Perl:如何从特定模式开始逐字读取文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31882086/

相关文章:

python - 如何在 python 中围绕解析函数的闭包中创建索引

java - 如何将斯坦福解析器软件集成到我的 java 程序中?

perl - Perl 如何在底层比较字符串?

perl - 为什么我从 DBIx::Class::InflateColumn::DateTime 对象中使用 sprintf 中的未初始化值?

perl - 如何在 Perl 中创建相对/近似日期?

linux - Bash 脚本到带有彩色线条的 tail -f

java - 数字解析库

parsing - 如何使用解析器表达式语法处理先前声明的常量?

perl - 使用 NonStop 调试器选项时如何将 perl 脚本的调试跟踪重定向到文件?

php - 如何解析这些字符串