Loops 如何避免2个循环并将数据存储在Perl中的数组中

Loops 如何避免2个循环并将数据存储在Perl中的数组中,loops,perl,Loops,Perl,我有一个脚本,它对输入数据中的数据数量进行计数,并根据计数进一步进行 下面是我的脚本,它按预期工作 #!/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+)

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

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

#!/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用于在执行while操作时遍历@array中存储的每个数据元素

是否可能只有一个循环,无论是在何时何地,我都可以获得计数,并且基于计数,我可以从数据中获得节点名。

将元素推送到第一个循环中的@nodes数组。 仅当$count正确时,才在循环后使用@nodes数组

您可以使用@nodes=;,清除@nodes数组

将元素推送到第一个循环中的@nodes数组。 仅当$count正确时,才在循环后使用@nodes数组


您可以使用@nodes=;,清除@nodes数组

这似乎是你想要的:

#!/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

这似乎是你想要的:

#!/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

上述解决方案是好的。但若你们的数据在文件操作中,你们可以使用这个模块

fmap阻止列表

使用块作为映射函数,对列表中的文件执行映射操作。块的结果将追加到调用结束时返回的列表中

use strict;
use warnings;
use File::Grep qw(fmap);
use Data::Dumper;

my @nodes;
my $count_flag = 0;

# my @result  = fmap { <block> } file_name; 
# modified "Total number .." regex, added \s*[1-9]\d*$ 
# (checking number between 1-9 followed by \d equivalent to [0-9])
# so if Total number of data found value is greater than zero setting flag to 1
fmap { (/NodeName : (\w+)/ ? push(@nodes,$1) : ((/Total number of data found :\s*[1-9]\d*$/) ? $count_flag = 1 : () ) )} *DATA;

if ($count_flag) {
    print Dumper(\@nodes);
} else {
    print "Count is less than 1.. Exiting\n";
    exit 0;
}

__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 : 1

上述解决方案是好的。但若你们的数据在文件操作中,你们可以使用这个模块

fmap阻止列表

使用块作为映射函数,对列表中的文件执行映射操作。块的结果将追加到调用结束时返回的列表中

use strict;
use warnings;
use File::Grep qw(fmap);
use Data::Dumper;

my @nodes;
my $count_flag = 0;

# my @result  = fmap { <block> } file_name; 
# modified "Total number .." regex, added \s*[1-9]\d*$ 
# (checking number between 1-9 followed by \d equivalent to [0-9])
# so if Total number of data found value is greater than zero setting flag to 1
fmap { (/NodeName : (\w+)/ ? push(@nodes,$1) : ((/Total number of data found :\s*[1-9]\d*$/) ? $count_flag = 1 : () ) )} *DATA;

if ($count_flag) {
    print Dumper(\@nodes);
} else {
    print "Count is less than 1.. Exiting\n";
    exit 0;
}

__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 : 1