Выведите следующую строку после сопоставления с шаблоном, используя perl - PullRequest
0 голосов
/ 18 февраля 2020

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

 Car Type, Price,  Colour,

 N17,       200$    white    
 A57,       250$    Red     
 L45,       350$    Black  

Ниже приведен код, который у меня сейчас.

my @cartype;
while (@cartype = <FH1> ) {

    my $i = 0;

    foreach my $a (@cartype) {
        if ($a =~ m/(Car)/ )  {
            my $b = $cartype[$i+1];
            push (@cartype, $b);
            print $b;
        }

        $i++;
    }
}

close;

Текущий вывод:

 N17,       200$    white    
 A57,       250$    Red     
 L45,       350$    Black

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

Ожидаемый результат:

    Car Type              
       N17             
       A57                 
       L45              
       ..               
       .                

1 Ответ

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

Почему бы не попробовать что-то в следующем духе? ​​

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $debug = 0;      # debug flag

my $look_for = shift || usage();

my %cars;

my @header = map{ s/(^ +| +$)//; $_ } (split ',', <DATA> );

chomp @header;      # clean up header fields

say Dumper(\@header) if $debug;

while(<DATA>) {
    next if /^ *$/;                             # skip empty lines
    chomp;                                      # snip eol
    if( /(\w\d{2}), +(\d{3}\$) +(\w+)/ ) {      # our data
        @{$cars{$1}}{@header} = ($1,$2,$3);     # fill %cars with data
    }
}

say Dumper(\%cars) if $debug;

$look_for = 'Car Type' if $look_for eq 'Car';
$look_for = 'Car Type' if $look_for eq 'Type';

say "\nLooking for: $look_for\n";

while( my($k,$v) = each %cars ) {
    say "  " . $v->{$look_for};                 # print field of interest
}

sub usage {
    say 
"
    USAGE: $0 [Car|Type|Colour|Price]
";
    exit 0;
}

__DATA__
Car Type, Price,  Colour

N17,       200$    white
A57,       250$    Red
L45,       350$    Black
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...