Нужно получить значение в га sh в perl - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно получить определенное значение из каждой строки, показанной ниже:

ABC_ROOT|/home/pulkit/pulkit_test/ABC/ABC-012/ABC04.16.103/lnx86
DEF_ROOT|/home/pulkit/pulkit_test/DEF/DEF192/DEF19.20.100/lnx86
GHI_ROOT|/home/pulkit/pulkit_test/GHI/GHI19.10.199/lnx86/tools.lnx86
JKL_ROOT|/home/pulkit/pulkit_test/JKL/JKL19.00.000/lnx86

Из приведенных выше строк я хочу извлечь значения с номерами версий (ABC04.16.103, DEF19.20.100, GHI19.10.199, JKL19.00.000) и сохранить эти значения в га sh, используя Perl. Чтобы сохранить эти значения в массиве, я использовал приведенный ниже код с помощью этого сайта:

use strict;
use warnings;

open (File, "/home/pulkit/pulkit_test/abc_test.txt");
my @value;

map { m|/([^/]+)/lnx\d+| and push @value, $1 } <File>;

print join( "\n" , @value,"\n");

Поскольку я очень плохо знаком с perl, может кто-нибудь помочь с тем, как я могу сохранить эти значения в га sh.

Спасибо

1 Ответ

1 голос
/ 07 февраля 2020

Вы можете использовать что-то вроде этого:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

open( FILE, '<', 'sample.txt');

my %R = map { m{^([^\|]*)\|(?:/[^/]*)*/([^/]*)/lnx\d}; $1 => $2 } <FILE>;

print Dumper(\%R);
  • Dumper просто для удобства и простоты вывода
  • map может возвращать хэши $1 => $2 делает это
  • регулярное выражение m{^([^\|]*)\|(?:/[^/]*)*/([^/]*)/lnx\d}
  • ^([^\|]*)\| - захватывает 'ключ' - строку в начале, которая заканчивается |
  • (?:/[^/]*)* - это пропускает все каталоги до того, как значение - (?:) - не захватывает группу

Я думаю, что регулярное выражение - это слишком много, я бы предложил использовать другой подход:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

open( FILE, '<', 'sample.txt');

my %R = ();

while (<FILE>) {
    my @fields = split m{[|/]};
    my $value;
    do {
        $value = pop @fields;
    } until $value !~ /lnx\d+/;
    $R{$fields[0]} = $value;
}

print Dumper(\%R);
  • вместо регулярного выражения вы разбиваете строку на несколько полей
  • ваше поле $ [0] будет вашим ключом
  • значение будет последним полем перед соответствие поля / lnx \ d /
    • pop @fields получает последний элемент массива
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...