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。