Вопрос по хэш-сортировке и печати в Perl - PullRequest
2 голосов
/ 17 ноября 2010

У меня проблемы с печатью содержимого моего хэша.

Фрагмент кода как этот,

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

my (%data, $keyword);

while (my $line = <DATA>){
    next unless $line =~ /\S/;
    chomp $line;
    if ($line =~ /^Keyword/){
        $keyword = $line;
    }
    else {
        push @{$data{$keyword}}, $line;
    }
}

# How to sort by keys using while loop?
while ( my ($k,$v) = each %data ) { 
    print "$k => $v\n";
}

# BTW, foreach loop sorting works.
#foreach my $key (sort (keys(%data))) {
#   print "$key \t$data{$key}\n";
#}

__DATA__
Keyword1
data1 a
Keyword2
data2 a
data2 b
data2 c
Keyword3


data3 a
data3 b


Keyword4
data4 a
data4 b

Выход:

D:\learning\perl>sc4.pl
Keyword3 => ARRAY(0x18418fc)
Keyword1 => ARRAY(0x28925c)
Keyword2 => ARRAY(0x2892fc)
Keyword4 => ARRAY(0x184360c)

На самом деле, я не думаю, что значение Keyword1 (data1 a, только одна строка ) - ARRAY. Но вывод все еще показал, что это был массив.

Не могли бы вы дать мне несколько советов о том, как правильно распечатать его.

Ценится за ваш вклад.

[обновление]

Я обновляю свой код для while loop, чтобы попытаться напечатать массив значений. но все равно не удалось.

while ( my ($k,@v) = each %data ) {
    print "$k\n";
    foreach (@v) {
    print Dumper (@v);
    print "$_\n";
    }
}

Выход:

D:\learning\perl>sc4.pl
Keyword3
$VAR1 = [
          'data3 a',
          'data3 b'
        ];
ARRAY(0x189a674)
Keyword1
$VAR1 = [
          'data1 a'
        ];
ARRAY(0x28925c)
Keyword2
$VAR1 = [
          'data2 a',
          'data2 b',
          'data2 c'
        ];
ARRAY(0x2892fc)
Keyword4
$VAR1 = [
          'data4 a',
          'data4 b'
        ];
ARRAY(0x1841a74)

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

Ответы [ 3 ]

7 голосов
/ 17 ноября 2010

Прежде всего, вам нужно определить, что вы подразумеваете под «сортировкой». Вы сортируете по ключам? По значениям?

Если вы сортируете по ключу, самое простое - использовать встроенную сортировку Perl следующим образом:

foreach (sort keys %data) {
    print "$_ => $data{$_};
}

Если вы хотите отсортировать по значению, вы можете определить анонимную функцию сортировки, которая сортирует по значению:

foreach (sort {$data{$a} <=> $data{$b}} keys %data) {
    print "$_ => $data{$_};
}

А если вам нужна любая другая сортировка, вы можете определить функцию, которая работает с глобальными переменными $a и $b (они устанавливаются автоматически с помощью sort) и возвращает -1, 0 или 1 в зависимости от порядка сортировки.

Если вы должны сделать это с помощью цикла while, мне нужно еще немного подумать.

1 голос
/ 17 ноября 2010

Самый простой способ, которым я знаю:

use Smart::Comments;
...
### %data

см. Smart::Comments.

Это не то, что вы хотите сделать в качестве последнего шага, я уверен. Но это работает в тех случаях, когда вы просто хотите посмотреть, что собрали.

Другой способ похож:

use Data::Dumper; 
say Data::Dumper->Dump( [ \%data ], [ '*data' ] );
0 голосов
/ 17 ноября 2010

В конце концов я нашел решение напечатать массив массивов в Perl.

Я обновил свой While Loop, как показано ниже.

while ( my ($k,@v) = each %data ) {
    print "$k\n";
    print Dumper (@v);
    for (my $i = 0; $i < @v; $i++) {
        for (my $j = 0; $j < @{$v[$i]}; $j++) {
             print STDOUT "\$i: " . $i . " \$j: " . $j . " value: " . $v[$i][$j] . "\n";
        }
    }
}

Выход:

D:\learning\perl>sc4.pl
Keyword3
$VAR1 = [
          'data3 a',
          'data3 b'
        ];
$i: 0 $j: 0 value: data3 a
$i: 0 $j: 1 value: data3 b
Keyword1
$VAR1 = [
          'data1 a'
        ];
$i: 0 $j: 0 value: data1 a
Keyword2
$VAR1 = [
          'data2 a',
          'data2 b',
          'data2 c'
        ];
$i: 0 $j: 0 value: data2 a
$i: 0 $j: 1 value: data2 b
$i: 0 $j: 2 value: data2 c
Keyword4
$VAR1 = [
          'data4 a',
          'data4 b'
        ];
$i: 0 $j: 0 value: data4 a
$i: 0 $j: 1 value: data4 b
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...