perl正则表达式只能处理有限的文本吗?

perl正则表达式只能处理有限的文本吗?,perl,ubuntu,Perl,Ubuntu,我一直在尝试匹配字符串,并在匹配后输出所有文本 e、 g:我试着把“你好”这个词后面的所有内容都打印出来 $string = "hello its a good day" output: its a good day. 以下代码非常有效: my ($extract) = $string =~ /hello\s*(.+)$/; 当我尝试使用大量文本时会出现问题,比如字符串是一个包含数百个单词的文件,比如一个有多行的pragraph,我只想在某个单词后面使用文本,就像上面所说的那样。它根本没有

我一直在尝试匹配字符串,并在匹配后输出所有文本

e、 g:我试着把“你好”这个词后面的所有内容都打印出来

$string = "hello its a good day"

output: its a good day.
以下代码非常有效:

my ($extract) = $string =~ /hello\s*(.+)$/;
当我尝试使用大量文本时会出现问题,比如字符串是一个包含数百个单词的文件,比如一个有多行的pragraph,我只想在某个单词后面使用文本,就像上面所说的那样。它根本没有反应

范例

Dear sally, how is your day, I heard things are getting better
etc etc

how is everyone

sometimes. not alwyas etc etc etc etc

kind regards
所以我想拍下亲爱的莎莉之后的一切

产出将是:

, how is your day, I heard things are getting better
etc etc

how is everyone

sometimes. not alwyas etc etc etc etc

kind regards
我尝试使用split命令,但它只输出数字。

它根本没有响应,也不是很清楚。一个点。在正则表达式中,除换行符外,模式通常匹配任何字符

您的输入数据可能分布在多行中

您可以使用/s修改器更改点以匹配任何内容,但在这种情况下,像/hello\s*+$/s这样的模式将匹配hello之后文件的所有其余部分


你应该解释你想要达到的目标;然后我们可以提供更好的帮助

您可以尝试以下方法:

my $output;

while (my $line = <$fh>)
{
    if ($output)
    {
        $output .= $line;
        next;
    }

    if ($line =~ /hello\s*(.+)/)
    {
        $output = $1;
    }
}
我在一个150k+行的文本文件上测试了它,不到一秒钟就完成了

这里的基本逻辑是,我们遍历在$fh filehandle下打开的文件中的所有行,并查找匹配项。如果在一行中找到匹配项,则将行中匹配的部分保存到$output变量中。对于后续行,我们不执行任何匹配,而是将它们连接到$output变量中


处理完所有行后,$output变量包含与搜索字符串匹配的行以及后面的所有行。

您应该真正解释代码的实际功能。OP对他们想要什么还很不清楚,不经询问就猜测通常也帮不了什么忙。而且,没有人提到响应时间,因此它们是不相关的。一个非常普通的硬盘驱动器在一秒钟内可以读取100MB的数据,所以除非数据量很大,否则OP可以读取数百个字,所以最大读取时间约为10KBinsignificant@Borodin,我添加了简短的解释。你能展示一个最小但完整的程序来演示这个问题吗?