Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl中没有与大文件匹配的正则表达式_Regex_Perl - Fatal编程技术网

Regex perl中没有与大文件匹配的正则表达式

Regex perl中没有与大文件匹配的正则表达式,regex,perl,Regex,Perl,我有以下简单的脚本: my $filename = './log_file'; my $file; open(FILE, "$filename") or die "Cant open $filename\n"; local $/ = undef; $file = <FILE>; close(FILE); my $regexp = 'Something\n'; print "OK\n" if ($file =~ m{$regexp}msg); 当日志文件大小为2GB时,脚

我有以下简单的脚本:

my $filename = './log_file';
my $file; 
open(FILE, "$filename") or die "Cant open $filename\n"; 
local $/ = undef; 
$file = <FILE>; 
close(FILE); 
my $regexp = 'Something\n';
print "OK\n" if ($file =~ m{$regexp}msg); 
当日志文件大小为2GB时,脚本打印OK。 但是当它的大小为2.1GB或更大时,它就不能正常打印。
有人知道为什么吗?如何解决这个问题?我不想分割文件,因为我的正则表达式是多行的

当您将整个文件加载到变量中时,会将其读取到内存中。当内存超过2GB(取决于系统资源)时,这可能会导致内存不足。另外,根据您的操作系统可能遇到的大文件处理问题(特别是在32位系统上),在unix上签出“man largefile”,这将以2GB的速度启动


考虑到大小,在循环中一次读取行或块可能是最好的,而不是将整个内容含糊不清。当您读入文件时,可以通过在文件上使用滚动2(或更多)行窗口来处理多行匹配。

当您将整个文件加载到变量中时,可以将其读入内存。当内存超过2GB(取决于系统资源)时,这可能会导致内存不足。另外,根据您的操作系统可能遇到的大文件处理问题(特别是在32位系统上),在unix上签出“man largefile”,这将以2GB的速度启动


考虑到大小,在循环中一次读取行或块可能是最好的,而不是将整个内容含糊不清。当您读入文件时,可以通过在文件上使用滚动2(或更多)行窗口来处理多行匹配。

您的perl可能不会在启用
使用大文件时编译,这会将您的文件大小限制为2 Gig。您可以使用以下命令(如check)对此进行验证:

$perl -V:uselargefiles
uselargefiles='define';
正如dethorpe已经建议的那样,不管怎样,修改脚本以逐行处理事情,或者如果要跨多行进行测试,那么使用缓冲区可能是明智的

下面是一个如何使用5行缓冲区测试多行正则表达式的示例:

use strict;
use warnings;

my @buffer;

while (<DATA>) {
    push @buffer, $_;

    if (@buffer == 5 || eof) {
        my $buffer = join '', @buffer;
        while ($buffer =~ m{([a-z]+)\n(\d+)}g) {
            # Truncate buffer for match found
            @buffer = substr $buffer, pos $buffer;

            print "$1\n";
        }

        shift @buffer;
    }
}

__DATA__
1
2
3
4
5
6
7
abc
123
10
def
456 ghi
789
13
14
15
16

在编译perl时,可能不会启用
使用大型文件
,这会将文件大小限制为2 Gig。您可以使用以下命令(如check)对此进行验证:

$perl -V:uselargefiles
uselargefiles='define';
正如dethorpe已经建议的那样,不管怎样,修改脚本以逐行处理事情,或者如果要跨多行进行测试,那么使用缓冲区可能是明智的

下面是一个如何使用5行缓冲区测试多行正则表达式的示例:

use strict;
use warnings;

my @buffer;

while (<DATA>) {
    push @buffer, $_;

    if (@buffer == 5 || eof) {
        my $buffer = join '', @buffer;
        while ($buffer =~ m{([a-z]+)\n(\d+)}g) {
            # Truncate buffer for match found
            @buffer = substr $buffer, pos $buffer;

            print "$1\n";
        }

        shift @buffer;
    }
}

__DATA__
1
2
3
4
5
6
7
abc
123
10
def
456 ghi
789
13
14
15
16

实际的正则表达式是什么?这是32位Perl吗?什么操作系统?实际的正则表达式是什么?这是32位Perl吗?什么操作系统?我使用32位per时内存不足,但使用64位perl时内存不足,也没有匹配项。我使用32位per时内存不足,但使用64位perl时内存不足,也没有匹配项