- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
#! /usr/bin/perl
use strict;
use warnings;
my %h1 = (one => 1, two => 2);
my %h2 = (three =>3 , four => 4);
sub h_uno { \%h1 }
sub h_multi {
my %all = (%h1, %h2);
\%all;
}
while (my ($k, $v) = each %{h_uno()}) {
print "k=$k, v=$v\n";
}
# следующий цикл не завершится никогда
#while (my ($k, $v) = each %{h_multi()}) {
# print "k=$k, $v=$v\n";
#}
Но все же != зарплата часть суммарная большая
Такое нужно писать исключительно на хаскеле, иначе так и зашипят в прод как есть без переписывания.
1. Perl: First Appeared December 18, 1987
2. Pascal: First appeared 1970
Да перл еще сопли на стенке пальцем размазывал, когда на пацкале уже говномесили забористый Ънтерпрайзный бойлерплейт
«Common Lisp» (стандарту уже 24 года). Есть куча довольно старого кода на нём, которая прекрасно компилируется новыми компиляторами и не требует никакой поддержки.
Это вам не какой-нибудь «Rust».
если заминусовать комментарий с рейтингом -999, то может получиться смешно
Когда я работал на заводе -- мы юзали Perl.
И язык этот во сто крат интересней всяких там педонов.
Поясни, почему петля будет бесконечной?
Если коротко -- each == говно и связывает свой итератор с обьектом-аргументом.
Если развернуто: http://blogs.perl.org/users/rurban/2014/04/do-not-use-each.html
``h_multi`` каждый раз создает новый хеш и возвращает на него ссылку.
Почему ссылку?
Мы обязаны это делать, так как вернуть из функции можно только скаляр (хеш вернуть нельзя, а ссылка на него это скаляр).
``each`` создает итератор и привязывает его к хешу. Это сильно отличается от того, как устроены итераторы в других языках, но похоже на то, как работает указатель внутри открытого файла.
Просто представьте себе что внутри хеша есть указатель на ключ, следующий each сдвигает его на следующий ключ, и так до конца.
Однако ``each`` вычисляет значение выражения каждый раз, когда дергается цикл.
Соответственно, каждый раз вызывается ``h_multi``, который создает новый хеш с указателем на первый элемент.
``each`` его считывает, двигает дальше, получает новый хеш, его тоже читает, снова двигает, и так до бесконечности.
Q: почему $k разные в разных итерациях?
A: потому что hash не сортирован, это не массив
Q: почему работает h_uno?
A: потому что там возвращается ссылка на уже существующий хеш %h1, в ``h_multi`` создает новый хеш посредством слияния h1 и h2.
Q: чтобля?
A: в списковом контексте хеш выдает список ключ-значение. Несколько списков в списке сливаются (a,b,c,d) = ((a,b),c,d). Получившийся список при приведении к хешу заполняет его ключами из начениями (для примера выше a=>b, c=>d).
Кокок, я прошел собеседование?
ну и конечно же вот верная версия
либо