Как я могу избежать двух циклов и сохранить мои данные в массиве в Perl - PullRequest
1 голос
/ 05 августа 2020

У меня есть сценарий, который подсчитывает количество данных на входе 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 - для перебора каждого элемента данных, который были сохранены в @array при выполнении операции while.

Возможно ли иметь только 1 л oop, либо while, либо for, где я могу получить подсчет и на основе подсчета Я могу получить NodeName из DATA.

Ответы [ 3 ]

2 голосов
/ 05 августа 2020

Это похоже на то, что вы хотите:

#!/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
1 голос
/ 06 августа 2020

Приведенное выше решение хорошее. Но если ваши данные находятся в файле (файловая операция), вы можете использовать https://metacpan.org/pod/File :: Grep module

fmap BLOCK LIST

Выполняет map операция над файлами в LIST, используя BLOCK в качестве функции сопоставления. Результаты BLOCK будут добавлены в список, который возвращается в конце вызова.

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

Вывод

$VAR1 = [
          'Node1',
          'Node2'
        ];
0 голосов
/ 05 августа 2020

Pu sh элементов в массив @nodes в первом l oop. Используйте массив @nodes после l oop, только если $count правильно.

Вы можете очистить массив @nodes, используя @nodes = () ;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...