Можете ли вы объяснить систему хеширования Perl парню из PHP? - PullRequest
4 голосов
/ 03 декабря 2011

Как работают хеши Perl?Они похожи на массивы в PHP или какого-то другого зверя?

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

В любом случае, путья думал, что это сработало так:

PHP:

$argv['dog_name'] = 'missy';
$argv[0] = 'tree';

То же, что и Perl:

my %argv{'dog_name'} = 'missy';
my $argv[0] = 'tree';

Верно?Но вы не можете print (% argv {'dog_name'}) , вы должны (вернуть?) К print ($ argv {'dog_name'}) , что сбивает с толку?

Пытается ли он теперь печатать как переменную, как в PHP, echo $ argv ['dog_name']; ?Означает ли это (опять же), что хеш - это просто ассоциативный массив PHP с объявленным%, но $ для доступа к нему?

Не знаю, надеюсь, что некоторые PHP / Perl Guru могут объяснить, какхэши работают, и насколько они похожи на массивы PHP.

Ответы [ 8 ]

11 голосов
/ 03 декабря 2011

Чтобы написать

$argv['dog_name'] = 'missy';
$argv[0] = 'tree';

на Perl, вы должны написать это следующим образом:

$argv{dog_name} = 'missy';
$argv{0}        = 'tree';

, если у вас есть строгое правило, которое вам следует, то вам нужно будет предварительно объявитьпеременная:

my %argv;
$argv{dog_name} = 'missy';
$argv{0}        = 'tree';

Если вышеприведенное немного повторяется для вас, вы можете написать его:

my %argv = (
    dog_name => 'missy',
    0        => 'tree',
);

Более подробную информацию вы можете найти на странице справки perldata .

Короче говоря, причины, по которым сигилы меняются с % на $, заключаются в том, что %hash относится к хешу множественного числа (список пар значений ключа), а $hash{foo} относится кединственный элемент хеша.То же самое относится и к массивам, где @ относится к полному массиву, а $ относится к одному элементу.(как для массивов, так и для хэшей начальный символ @ с нижним индексом означает фрагмент данных, где передается несколько ключей и возвращается список значений)

5 голосов
/ 03 декабря 2011

Чтобы пояснить ответ Амброуза, причина вашего замешательства - в разнице между философией использования сигил в Perl и PHP.

В PHP сигил присоединен к идентификатору.Например, идентификатор хеша ВСЕГДА будет иметь хеш-символ вокруг него.

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

3 голосов
/ 03 декабря 2011

%argv{'dog_name'} - синтаксическая ошибка.Вместо этого вам нужно $argv{'dog_name'}.

Но вы правы, что хеш perl равен просто ассоциативным массивом (почему perl решил использовать другую терминологию, я не знаю).

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

2 голосов
/ 04 декабря 2011

Изменение сигил на самом деле не так сложно, как кажется.Вы уже делаете это по-английски, не задумываясь об этом.

Если у вас есть набор машин, вы бы поговорили об «этих машинах» (или «тех машинах»).Это похоже на массив.

my @cars = ('Vauxhall', 'Ford', 'Rolls Royce');

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

say $car[1]; # prints 'Ford';

Аналогичные правила также применяются к хэшам.

2 голосов
/ 03 декабря 2011

Я бы, как Flimzy, также порекомендовал бы программирование на Perl.Как недавнее преобразование PHP в Perl, я многому научил меня по поводу языка.

Символ % используется для создания полного «ассоциативного массива», как мы могли бы подумать.Например, я мог бы создать ассоциативный массив, выполнив следующее:

%hash = ('key1' => 'value1', 'key2' => 'value2');

Затем я мог бы распечатать его так:

print %hash;

Вывод будет выглядеть примерно так:

'key2value2key1value1'

Это, я полагаю, известно как «список контекста», поскольку % указывает, что мы говорим о диапазоне значений.

С другой стороны, если бы я хотелчтобы получить доступ к одному значению, мы должны использовать символ $.Это, как говорит нам «Программирование на Perl», можно рассматривать как «S» для «Скалярный».Мы должны использовать знак $ всякий раз, когда мы говорим о единственном числе.

Итак, чтобы получить доступ к отдельному элементу в массиве, мне нужно будет использовать следующий синтаксис:

print $hash{'key1'}; 

То же самое относится и к массивам.Полный массив может быть создан следующим образом:

@array = ('abc', '123');

, а затем напечатан следующим образом:

print @array;

Но, чтобы получить доступ к одному элементу массива, я бы набрал вместо этого:

print $array[0];

Здесь много основных принципов.Вы должны прочитать о «контексте списка» и «скалярном контексте» более подробно.Вскоре вам также захочется взглянуть на ссылки, которые вы используете для создания многомерных структур в Perl.Я действительно рекомендую «Программирование на Perl»!Это было трудно читать в главах, но оно, безусловно, охватывает все, что вам нужно знать (и даже больше).

1 голос
/ 03 декабря 2011

Я бы сказал, что ваше замешательство частично вызвано одним простым фактом. В Perl разные символы для разных вещей. В PHP есть один знак для всего.

Так что, независимо от того, помещаете ли вы что-то в массив / хэш, извлекаете что-то или объявляете простую скалярную переменную, в PHP вы всегда используете знак доллара.

С Perl вам нужно быть более конкретным, вот и все.

1 голос
/ 03 декабря 2011

«Сигилла», то есть символ перед именем переменной, обозначает количество данных, к которым осуществляется доступ, следующим образом:

  • Если вы говорите $hash{key}, вы используете скалярный контекст, то есть одно значение.

  • Для контекста множественного числа или списка сигил изменяется на @, поэтому @hash{('key1', 'key2')} возвращает список из двух значений, связанных с двумя ключами соответственно (может быть также записан как @hash{qw(key1 key2)}).

  • %hash используется для доступа к хешу в целом.

То же самое относится к массивам: $arr[0] = 1, но @arr[1 .. 10] = (10) x 10.

0 голосов
/ 03 декабря 2011

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

http://www.perl.com/pub/2006/11/02/all-about-hashes.html

PS: увеличьте коэффициент приема - 62% довольно низко

...