количество ключей в хеше - PullRequest
       0

количество ключей в хеше

2 голосов
/ 11 октября 2011

Я пытаюсь выяснить количество ключей и количество значений в хэше и распечатать эти числа. Я написал свой код, как это, но он не дал количество ключей. В чем ошибка в моем коде?

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

use XML::LibXML::Reader;
my $file;open $file, 'formal.xml');
my $reader = XML::LibXML::Reader->new( IO => $file ) or die ("unable to open file");

while ( $reader->nextElement( 'DATA' ) ) {
    my $info = $reader->readOuterXml();
    $reader->nextElement( 'Number' ); 
    my $number = $reader->readInnerXml(); 
    print( "num: $number\n" );
    print( " datainfo: $info\n" );

Как я могу хранить эти числа и данные в хэше? А как подсчитать количество ключей в хэше? Я пытался так, но это не работает.

my %nums =( "$number", $info);

while ((my $keys, my $values) = each (%nums)) { 
    print ("NUMBER:$keys." =>"INFORMATION: ".$values." \n");
}

my $key_count = keys %nums;
print "$key_count";
} 
close($file);
}

Когда я пытаюсь выполнить его, он дает только один номер, но у меня есть больше номеров. Может быть, мой хэш содержит одно число, но как я могу перебрать мой хэш, чтобы сохранить больше чисел?

Ответы [ 3 ]

7 голосов
/ 11 октября 2011

keys() и values() оба возвращают массивы. При ссылке в скалярном контексте массивы в Perl возвращают размер массива. Итак, чтобы получить количество ключей или значений в вашем хэше, просто укажите результат keys() или values() в скалярном контексте:

# prints the number of keys
print( scalar(keys(%hash)), "\n" );
print( keys(%hash) . "\n" );

# prints the number of values
print( scalar(values(%hash)), "\n" );
print( values(%hash) . "\n");

Использование массива %nums:

my %nums = ( $number, $info );
print( "number of keys: ", scalar(keys(%nums)), "\n" ); # will print `1'

Обратите внимание, что в вашем хэше %nums есть только одна пара ключ-значение, ключом является $number и значением $info (Более обычный и читаемый способ объявления %nums будет my %nums = ( $number => $info );)

2 голосов
/ 11 октября 2011

1001 * попробовать *

my %nums;
while ( $reader->nextElement( 'DATA' ) ) {     
   my $info = $reader->readOuterXml();     
   $reader->nextElement( 'number' );      
   my $number = $reader->readInnerXml();  
   $nums{$number} = $info;    
   print( "num: $number\n" );    
   print( " datainfo: $info\n" ); 
} 

и удалите my %nums =( "$number", $info);

Когда вы выполняете цикл while, ваши $ number и $ info каждый раз перезаписываются. Поэтому вам нужно хранить эти данные в хэше в цикле while.

1 голос
/ 04 декабря 2013

Цель: Я пытаюсь выяснить номера ключей и количество значений в хэше.

Вот прямой ответ на этот вопрос в целом.

Чтобы получить количество ключей в вашем хэше, примените функцию keys в скалярном контексте:

scalar keys %my_hash
# -or-
my $number_of_keys = keys %my_hash;

Количество значений будет идентичным (хотя одно или несколько значений могут быть неопределенными). Вы можете доказать это, применив функцию values аналогичным образом:

scalar values %my_hash
# -or-
my $number_of_values = values %my_hash;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...