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

#perl

#perl

Вопрос:

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

 #!/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: $numbern" );
    print( " datainfo: $infon" );
  

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

 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);
}
  

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

Комментарии:

1. можете ли вы привести пример данных inpit?

2. Подождите, вы повторно инициализировали хэш внутри цикла чтения во время цикла? Перечислить его содержимое в том же цикле? Это сбивает с толку. Не похоже, что эти проблемы имеют какое-либо отношение к вашему вопросу, но они приводят к тому, что вы не получаете правильный вывод.

Ответ №1:

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 ); )

Комментарии:

1. вы пишете в моем хэше%nums у меня есть только один элемент, так как я могу повторить больше чисел в том же хэше, чтобы получить все значения в моем хэше.

2. Вот пример: for my $num (1..10) { $nums{$num} = "info$num" } . %nums теперь будет выглядеть так: ( 1 => 'info1', 2 => 'info2', ...) . Затем, чтобы увидеть, сколько ключей у вас есть: print scalar(keys(%nums)) (будет напечатано 10 )

Ответ №2:

попробуйте

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

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

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

Комментарии:

1. я попробовал, как указано выше, и удалил строку, как вы сказали, и после того, как я удалил свой второй цикл while, он также печатал каждое число и информацию после этого, отображая количество ключей в хэше каждый раз, когда оно увеличивается. например, 1,2,3, …. 141. есть ли какая-либо возможность напечатать общее количество ключей 141 таким образом, не увеличивая от 1 до 141. а также, если поместить мой второй цикл while, который непрерывно повторяется бесконечно, вывода нет. @Andrey

2. Можете ли вы привести пример входных данных, выходных данных, которые вы получаете, и желаемого результата?

Ответ №3:

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

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

Чтобы получить количество ключей в вашем хэше, примените 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;