activePerl 5.8 базирующимся
#!C:\Perl\bin\perl.exe
use strict;
use warnings;
# declare a new hash
my %some_hash;
%some_hash = ("foo", 35, "bar", 12.4, 2.5, "hello",
"wilma", 1.72e30, "betty", "bye\n");
my @any_array;
@any_array = %some_hash;
print %some_hash;
print "\n";
print @any_array;
print "\n";
print $any_array[0];
print "\n";
print $any_array[1];
print "\n";
print $any_array[2];
print "\n";
print $any_array[3];
print "\n";
print $any_array[4];
print "\n";
print $any_array[5];
print "\n";
print $any_array[6];
print "\n";
print $any_array[7];
print "\n";
print $any_array[8];
print "\n";
print $any_array[9];
Вывод как это
D:\learning\perl>test.pl
bettybye
bar12.4wilma1.72e+030foo352.5hello
bettybye
bar12.4wilma1.72e+030foo352.5hello
betty
bye
bar
12.4
wilma
1.72e+030
foo
35
2.5
hello
D:\learning\perl>
Что решило порядок печати элементов в моем примере кода?
Правило следовать, когда печать смешанное (строки, числа) хешируют в Perl?Спасибо.
bar12.4wilma1.72e+030foo352.5hello
[Обновленный]
С Вами парни помогают, я обновил код как ниже.
#!C:\Perl\bin\perl.exe
use strict;
use warnings;
# declare a new hash
my %some_hash;
%some_hash = ("foo", 35, "bar", 12.4, 2.5, "hello",
"wilma", 1.72e30, "betty", "bye");
my @any_array;
@any_array = %some_hash;
print %some_hash;
print "\n";
print "\n";
print @any_array;
print "\n";
print "\n";
my @keys;
@keys = keys %some_hash;
for my $k (sort @keys)
{
print $k, $some_hash{$k};
}
вывод
D:\learning\perl>test.pl
bettybyebar12.4wilma1.72e+030foo352.5hello
bettybyebar12.4wilma1.72e+030foo352.5hello
2.5hellobar12.4bettybyefoo35wilma1.72e+030
D:\learning\perl>
Finially, после того, как названо keys
и sort
функции. Печать ключей хеша следовала правилу ниже
2.5hellobar12.4bettybyefoo35wilma1.72e+030
] Элементы хэша распечатываются в их внутреннем порядке, на который нельзя полагаться, и который будет меняться по мере добавления и удаления элементов. Если вам нужны все элементы хэша в некотором порядке, отсортируйте ключи и используйте этот список для индексирования хэша. [
] []Если вы ищете структуру, которая держит элементы в порядке, используйте либо массив, либо один из упорядоченных хэшей в CPAN.[
] []единственный порядок, на который вы можете положиться из хэш-расширения контекста списка - это то, что пары значений key => будут вместе.[
].Я просмотрел ваш код и сделал несколько заметок, которые, думаю, вам помогут.
use strict;
use warnings;
# declare a new hash and initialize it at the same time
my %some_hash = (
foo => 35, # use the fat-comma or '=>' operator, it quotes the left side
bar => 12.4,
2.5 => "hello",
wilma => 1.72e30,
betty => "bye", # perl ignores trailing commas,
# the final comma makes adding items to the end of the list less bug prone.
);
my @any_array = %some_hash; # Hash is expanded into a list of key/value pairs.
print "$_ => $some_hash{$_}\n"
for keys %some_hash;
print "\n\n", # You can print multiple newlines in one string.
"@any_array\n\n"; # print takes a list of things to print.
# In print @foo; @foo is expanded into a list of items to print.
# There is no separator between the members of @foo in the output.
# However print "@foo"; interpolates @foo into a string.
# It inserts spaces between the members of the arrays.
# This is the block form of 'for'
for my $k (sort keys %some_hash)
{
# Interpolating the variables into a string makes it easier to read the output.
print "$k => $some_hash{$k}\n";
}
Hashes обеспечивает неупорядоченный доступ к данным по строковому ключу.
Массивы обеспечивают доступ к упорядоченным данным. Случайный доступ возможен с помощью числового индекса.
Если необходимо сохранить порядок группы значений, используйте массив. Если вам нужно искать членов группы по ассоциированному имени, используйте хэш.
Если вам нужно сделать и то, и другое, вы можете использовать обе структуры вместе:
# Keep an array of sorted hash keys.
my @sorted_items = qw( first second third fourth );
# Store the actual data in the hash.
my %item;
@item{ @sorted_items } = 1..4; # This is called a hash slice.
# It allows you to access a list of hash elements.
# This can be a very powerful way to work with hashes.
# random access
print "third => $item{third}\n";
# When you need to access the data in order, iterate over
# the array of sorted hash keys. Use the keys to access the
# data in the hash.
# ordered access
for my $name ( @sorted_items ) {
print "$name => $item{$name}\n";
}
Глядя на примеры вашего кода, я вижу пару вещей, над которыми вы, возможно, захотите поработать.
для
и , в то время как
можно использовать для уменьшения количества повторений кода. BTW, я рад видеть, что вы работаете над основами и улучшаете качество вашего кода. Это вложение времени окупится. Продолжайте в том же духе
.Для большинства практических целей порядок, в котором хэш-таблица (не только Perl хэш-переменные, но и хэш-таблицы в целом) может считаться случайным.
В действительности, в зависимости от реализации хэширования, порядок может быть детерминированным. (т.е. если вы запустите программу несколько раз, каждый раз помещая одни и те же элементы в хэш-таблицу в одном и том же порядке, они каждый раз будут храниться в одном и том же порядке). Я знаю, что у Perl-хэшей раньше была такая характеристика, но я не уверен насчет текущих версий. В любом случае, порядок следования хэш-ключей не является надежным источником случайности для использования в тех случаях, когда случайность желательна.
Короткая версия, тогда:
Не используйте хэш, если вас волнует порядок (или отсутствие порядка). Если вы хотите фиксированный порядок, то он будет фактически случайным, а если вы хотите случайный порядок, то он будет эффективно исправлен.
Элементы (почти наверняка) распечатываются в том порядке, в котором они появляются (внутренне) в самой хэш-таблице -- т.е. на основе значений хэшей их ключей.
Общее правило, которому следует следовать, - использовать что-то, отличное от хэш-таблицы, если вас сильно волнует порядок.