2015-04-03 8 views
1

Как я могу зацикливать каждый элемент в первой строке, а затем переходить ко второй строке и т. Д. Ниже сценария несколько работает, но я не получаю желаемого вывода. Может кто-нибудь, пожалуйста, помогите мне.Perl loop through hash массивов

test.txt

ABC-13077 817266 55555 
ABC-13092 816933 
CAMC-13093 817361 

script.pl

#!/usr/bin/perl -w 
use strict; 

my %hash =(); 
my $file = "test.txt"; 

open (my $fh, "<", $file) or die "Can't open the file $file: "; 

while (my $line =<$fh>) 
{ 
    chomp ($line); 
    my($key) = split(/\+s/, $line); 
    $hash{$key} = 1; 
} 

foreach my $key (keys %hash) 
{ 
    print "$key\n"; 
    print "loop\n"; 
} 

тока output.txt

ABC-13077 817266 55555 
loop 
ABC-13092 816933 
loop  
CAMC-13093 817361 

желаемого output.txt

ABC-13077 
817266 
55555 
loop 
ABC-13092 
816933 
loop  
CAMC-13093 
817361 

ответ

1

Во-первых, вам необходимо изменить /\+s/ на /\s+/.

Во-вторых, вы можете хранить ваши данные в хэш-из-массивов (perldsc):

use warnings; 
use strict; 
my %hash =(); 

while (my $line =<DATA>) 
{ 
    chomp ($line); 
    my ($key, @vals) = split(/\s+/, $line); 
    $hash{$key} = [@vals]; 
} 

foreach my $key (sort keys %hash) 
{ 
    print "$key\n"; 
    print "$_\n" for @{ $hash{$key} }; 
    print "loop\n"; 
} 

__DATA__ 
ABC-13077 817266 55555 
ABC-13092 816933 
CAMC-13093 817361 

Выход:

ABC-13077 
817266 
55555 
loop 
ABC-13092 
816933 
loop 
CAMC-13093 
817361 
loop 
+1

Он работал !!! Спасибо за быстрый ответ.. – Mihir