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