Что решает порядок ключей, когда я печатаю хеш Perl?

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
5
задан brian d foy 6 January 2010 в 09:36
поделиться

4 ответа

[

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

] [

]Если вы ищете структуру, которая держит элементы в порядке, используйте либо массив, либо один из упорядоченных хэшей в CPAN.[

] [

]единственный порядок, на который вы можете положиться из хэш-расширения контекста списка - это то, что пары значений key => будут вместе.[

].
22
ответ дан 18 December 2019 в 05:21
поделиться

Я просмотрел ваш код и сделал несколько заметок, которые, думаю, вам помогут.

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, я рад видеть, что вы работаете над основами и улучшаете качество вашего кода. Это вложение времени окупится. Продолжайте в том же духе

.
3
ответ дан 18 December 2019 в 05:21
поделиться

Для большинства практических целей порядок, в котором хэш-таблица (не только Perl хэш-переменные, но и хэш-таблицы в целом) может считаться случайным.

В действительности, в зависимости от реализации хэширования, порядок может быть детерминированным. (т.е. если вы запустите программу несколько раз, каждый раз помещая одни и те же элементы в хэш-таблицу в одном и том же порядке, они каждый раз будут храниться в одном и том же порядке). Я знаю, что у Perl-хэшей раньше была такая характеристика, но я не уверен насчет текущих версий. В любом случае, порядок следования хэш-ключей не является надежным источником случайности для использования в тех случаях, когда случайность желательна.

Короткая версия, тогда:

Не используйте хэш, если вас волнует порядок (или отсутствие порядка). Если вы хотите фиксированный порядок, то он будет фактически случайным, а если вы хотите случайный порядок, то он будет эффективно исправлен.

1
ответ дан 18 December 2019 в 05:21
поделиться

Элементы (почти наверняка) распечатываются в том порядке, в котором они появляются (внутренне) в самой хэш-таблице -- т.е. на основе значений хэшей их ключей.

Общее правило, которому следует следовать, - использовать что-то, отличное от хэш-таблицы, если вас сильно волнует порядок.

2
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: