首页 > 解决方案 > 如何避免 2 个循环并将我的数据存储在 Perl 的数组中

问题描述

我有一个脚本,它会计算输入中的数据数量,DATA并根据计数进一步进行。

下面是我的脚本,它按预期工作。

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my (@array, @nodes);

my $count = 0;
while (<DATA>) {
    push @array, $_;
    $count = $1 if /Total number of data found :\s*(\d+)/;
}
print "Count:$count\n";

print "Array".Dumper(\@array);

if( $count > 0 ){
    foreach my $ele(@array){
        chomp $ele;
        if( $ele =~ /NodeName : (\w+)/){
            push @nodes, $1;
        }
    }
} else {
    print "Count is less than 1.. Existing\n";
    exit 0;
}

print Dumper(\@nodes);

__DATA__
Data : Network=R9,N=Node1
NodeName : Node1
DateTime : 05-08-2020 10:00:05

Data : Network=R9,N=Node2
NodeName : Node2
DateTime : 05-08-2020 10:00:10

Total number of data found : 2

但在这里我使用 2 个循环,while并且foreach.

while用于捕获计数,并在执行操作时foreach遍历存储的每个数据元素。@arraywhile

是否有可能只有 1 个循环,或者whilefor可以在哪里获得计数,并且基于我可以NodeNameDATA.

标签: loopsperl

解决方案


这似乎做你想做的事:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @nodes;

my $count = 0;
while (<DATA>) {
  chomp;

  push @nodes, $1 if /NodeName : (\w+)/;
  $count = $1 if /Total number of data found :\s*(\d+)/;
}
print "Count:$count\n";

if ($count <= 0) {
    print "Count is less than 1.. Exiting\n";
    exit 0;
}

print Dumper(\@nodes);

__DATA__
Data : Network=R9,N=Node1
NodeName : Node1
DateTime : 05-08-2020 10:00:05

Data : Network=R9,N=Node2
NodeName : Node2
DateTime : 05-08-2020 10:00:10

Total number of data found : 2

推荐阅读