Perl从文件中读取数据并提取某些行内容
我正在从文件中提取某些数据。脚本应根据Perl从文件中读取数据并提取某些行内容,perl,fetch,Perl,Fetch,我正在从文件中提取某些数据。脚本应根据活动状态从给定数据中获取元素值。 如果状态是活动的,我需要从上一行获取相应的元素值 我的代码如下,其工作性能良好 #!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @list; my @lines = <DATA>; foreach (0 .. $#lines) { chomp $lines[$_]; next if (/^\s+$/); if
活动状态从给定数据中获取元素值。
如果状态是活动的,我需要从上一行获取相应的元素值
我的代码如下,其工作性能良好
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @list;
my @lines = <DATA>;
foreach (0 .. $#lines) {
chomp $lines[$_];
next if (/^\s+$/);
if ($lines[$_+1] =~ /active : yes/){
if($lines[$_] =~ /Element=(\w+)/){
push (@list, $1);
}
}
}
print Dumper(\@list);
__DATA__
Data : Element=123456
active : yes
Data : Element=789101
active : yes
Data : Element=23456
active : no
我需要专家建议这是获取数据的正确方法吗
空的
行,使用next if(/^\s+$/)分隔每个不跳过的数据内容代码>语句
分隔每个数据内容的空行,不使用
下一个if(/^\s+$/);声明
正则表达式/^\s+$/
将只匹配至少有一个空格字符的空行
您需要/^\s*$/
。这将匹配具有零个或多个空格字符的空行
分隔每个数据内容的空行,不使用
下一个if(/^\s+$/);声明
正则表达式/^\s+$/
将只匹配至少有一个空格字符的空行
您需要/^\s*$/
。这将匹配具有零个或多个空格字符的空行。关于代码的结构,可以通过在正则表达式中同时匹配元素
行和活动
行来简化代码结构
my @list;
# read all the input data into $data
local $/;
my $data = <DATA> ;
while ($data =~ /Element=(\d+)\nactive : yes/g)
{
push @list, $1
}
print Dumper(\@list);
my@list;
#将所有输入数据读入$data
本地$/;
我的$data=;
而($data=~/Element=(\d+)\n活动:是/g)
{
推送@list,$1
}
打印转储程序(\@list);
关于代码的结构,您可以通过在正则表达式中同时匹配元素
行和活动
行来简化代码结构
my @list;
# read all the input data into $data
local $/;
my $data = <DATA> ;
while ($data =~ /Element=(\d+)\nactive : yes/g)
{
push @list, $1
}
print Dumper(\@list);
my@list;
#将所有输入数据读入$data
本地$/;
我的$data=;
而($data=~/Element=(\d+)\n活动:是/g)
{
推送@list,$1
}
打印转储程序(\@list);
这里没有对错,但这就是我要做的
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @list;
$/ = '';
while (<DATA>) {
chomp;
next unless /active : yes/;
if (/Element=(\d+)/) {
push (@list, $1);
}
}
print Dumper(\@list);
__DATA__
Data : Element=123456
active : yes
Data : Element=789101
active : yes
Data : Element=23456
active : no
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的@list;
$/ = '';
而(){
咀嚼;
下一个除非/激活:是/;
如果(/Element=(\d+/){
推送(@list,$1);
}
}
打印转储程序(\@list);
__资料__
数据:元素=123456
主动:是的
数据:元素=789101
主动:是的
数据:元素=23456
活动:否
最大的区别是使用$/=''
将Perl置于“段落模式”,这意味着每次循环,您都在处理整个记录(即,两行同时处理)。这使得一些逻辑变得更简单。这里没有对错,但这就是我要做的
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my @list;
$/ = '';
while (<DATA>) {
chomp;
next unless /active : yes/;
if (/Element=(\d+)/) {
push (@list, $1);
}
}
print Dumper(\@list);
__DATA__
Data : Element=123456
active : yes
Data : Element=789101
active : yes
Data : Element=23456
active : no
#/usr/bin/perl
严格使用;
使用警告;
使用数据::转储程序;
我的@list;
$/ = '';
而(){
咀嚼;
下一个除非/激活:是/;
如果(/Element=(\d+/){
推送(@list,$1);
}
}
打印转储程序(\@list);
__资料__
数据:元素=123456
主动:是的
数据:元素=789101
主动:是的
数据:元素=23456
活动:否
最大的区别是使用$/=''
将Perl置于“段落模式”,这意味着每次循环,您都在处理整个记录(即,两行同时处理)。这使一些逻辑变得更简单。我犯了一个错误。如果($lines[$\u]=~/^\ s+$/),则它应该是next代码>。我犯了一个错误。如果($lines[$\u]=~/^\ s+$/),则它应该是next
。当$\ucode>是$\lines
——数组中的最后一个索引时,它在最后一轮迭代中用$行[$\u1]
查询一个通过数组边界的对象。这应该是一个警告。你没有收到警告吗?///你在下一个if…
中发布了针对索引的正则表达式测试,不是一个元素,但我知道这是一个输入错误(然后编辑帖子以更正它?),否则,你不需要嵌套if
——只要(if…
@zdim是的,我收到了一个警告。啊,好的;这些信息属于问题,这很重要。因此,您需要小心使用这些索引(当您使用索引时总是如此!)。。。但是看起来您不需要转到最后一个,因为当循环位于前一个循环时,它会被检查。然后对我的$i(0..$#lines-1)
?当$\ucode>是数组中的最后一个索引时,这将在最后一轮迭代中使用$lines[$#1]
查询一个通过数组边界的对象。这应该是一个警告。你没有收到警告吗?///你在下一个if…
中发布了针对索引的正则表达式测试,不是一个元素,但我知道这是一个输入错误(然后编辑帖子以更正它?),否则,你不需要嵌套if
——只要(if…
@zdim是的,我收到了一个警告。啊,好的;这些信息属于问题,这很重要。因此,您需要小心使用这些索引(当您使用索引时总是如此!)。。。但是看起来您不需要转到最后一个,因为当循环位于前一个循环时,它会被检查。然后就为我的$i(0..$#lines-1)
?非常有用的建议@Dave。非常有用的建议@Dave。