Regex 使用perl将关键字之间的数据提取到数组中

Regex 使用perl将关键字之间的数据提取到数组中,regex,perl,search,data-structures,Regex,Perl,Search,Data Structures,我有一个文件,其中有像帧1,帧2,帧3关键字。。。帧100+,我想提取每个帧之间的数据并将其放入数组中。我试过了,但没有按我的需要得到。我一直在寻找匹配的线路。我试过两种方法 my $key1 = "Frame 1" ; my $key2 = "Frame 2"; while (<ReadHandle>){ if (/^$key1/../^$key2/){ @linearray=$_; print "\n @linearray \n" ;

我有一个文件,其中有像帧1,帧2,帧3关键字。。。帧100+,我想提取每个帧之间的数据并将其放入数组中。我试过了,但没有按我的需要得到。我一直在寻找匹配的线路。我试过两种方法

my $key1 = "Frame 1" ;
my $key2 = "Frame 2";

while (<ReadHandle>){
    if (/^$key1/../^$key2/){
        @linearray=$_;
        print "\n  @linearray \n" ;
    }
}

以此类推。。非常感谢您的帮助或建议。

您可以使用array of array

my @linearray;
while (<ReadHandle>){
   push @linearray, [] if /^Frame/;
   push @{ $linearray[-1] }, $_ if @linearray;
}   

use Data::Dumper;
print Dumper \@linearray;
my@linearray;
而(){
按@linearray,[]如果/^Frame/;
按{$linearray[-1]},如果@linearray;
}   
使用数据::转储程序;
打印转储程序\@linearray;

您可以使用数组的数组

my @linearray;
while (<ReadHandle>){
   push @linearray, [] if /^Frame/;
   push @{ $linearray[-1] }, $_ if @linearray;
}   

use Data::Dumper;
print Dumper \@linearray;
my@linearray;
而(){
按@linearray,[]如果/^Frame/;
按{$linearray[-1]},如果@linearray;
}   
使用数据::转储程序;
打印转储程序\@linearray;

如果您的文件不是很大,那么您可以将整个文件读入一个字符串,并在
帧上拆分它们。这样,整个帧将有一个数组元素

use strict;
use warnings; 
use Data::Dumper; 

my $data = do{ undef $/; <DATA> };
my @linearray = split /(?m)(?=^Frame \d+:)/, $data; 

print Dumper \@linearray;

__DATA__
Frame 1: 140 bytes on wire (1120 bits), 140 bytes captured (1120 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Jun 11, 2014 16:03:37.864278820 India Standard Time
Ethernet II, Src: Cisco_a9:94:0a (00:30:96:a9:94:0a), Dst: IPv6mcast_00:00:00:0d (33:33:00:00:00:0d)
Frame 2: 90 bytes on wire (720 bits), 90 bytes captured (720 bits)
    Encapsulation type: Ethernet (1)
Internet Protocol Version 6, Src: ::200:1:1:2 (::200:1:1:2), Dst: ff02::1:ff01:1 (ff02::1:ff01:1)
    0110 .... = Version: 6

如果文件不是很大,则可以将整个文件读入一个字符串中,并在
帧上拆分它们。这样,整个帧将有一个数组元素

use strict;
use warnings; 
use Data::Dumper; 

my $data = do{ undef $/; <DATA> };
my @linearray = split /(?m)(?=^Frame \d+:)/, $data; 

print Dumper \@linearray;

__DATA__
Frame 1: 140 bytes on wire (1120 bits), 140 bytes captured (1120 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Jun 11, 2014 16:03:37.864278820 India Standard Time
Ethernet II, Src: Cisco_a9:94:0a (00:30:96:a9:94:0a), Dst: IPv6mcast_00:00:00:0d (33:33:00:00:00:0d)
Frame 2: 90 bytes on wire (720 bits), 90 bytes captured (720 bits)
    Encapsulation type: Ethernet (1)
Internet Protocol Version 6, Src: ::200:1:1:2 (::200:1:1:2), Dst: ff02::1:ff01:1 (ff02::1:ff01:1)
    0110 .... = Version: 6

谢谢杰帕尔。虽然可以,但是我的文件很大。谢谢Jaypal。虽然它可以工作,但我的文件相当大。我喜欢这样:它简洁明了,
[-1]
明确提醒您需要
推到创建的最后一个(或“最近的”即
[-1]
)内部数组元素(“空
[]
匿名数组)上通过匹配来构建AoA。我的TIMTOWDI想法是匹配所有内容,并将它(按“顺序”)封装在
[]
中,但这更简单-如果更难记住的话。我喜欢这样:
[-1]
明确提醒您需要将
推到最后一个(或最新的“即,
[-1]
)内部数组元素,由match
/
创建,用于构造AoA的“空的
[]
匿名数组”。我的TIMTOWDI想法是匹配所有内容,并以
[]
的形式(按“顺序”)推送它,但这更简单——如果记忆有点困难的话。
$VAR1 = [
          'Frame 1: 140 bytes on wire (1120 bits), 140 bytes captured (1120 bits)
    Encapsulation type: Ethernet (1)
    Arrival Time: Jun 11, 2014 16:03:37.864278820 India Standard Time
Ethernet II, Src: Cisco_a9:94:0a (00:30:96:a9:94:0a), Dst: IPv6mcast_00:00:00:0d (33:33:00:00:00:0d)
',
          'Frame 2: 90 bytes on wire (720 bits), 90 bytes captured (720 bits)
    Encapsulation type: Ethernet (1)
Internet Protocol Version 6, Src: ::200:1:1:2 (::200:1:1:2), Dst: ff02::1:ff01:1 (ff02::1:ff01:1)
    0110 .... = Version: 6
'
        ];