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