Regex 使用perl将关键字之间的数据提取到数组中
我有一个文件,其中有像帧1,帧2,帧3关键字。。。帧100+,我想提取每个帧之间的数据并将其放入数组中。我试过了,但没有按我的需要得到。我一直在寻找匹配的线路。我试过两种方法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" ;
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
'
];