- 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";
#}
guest8 09.10.2018 12:25 # +1
Elvenfighter 09.10.2018 15:58 # +1
guest8 09.10.2018 16:01 # +1
Elvenfighter 10.10.2018 00:50 # +2
guest8 10.10.2018 01:08 # +1
guest8 11.10.2018 00:14 # 0
DOKTOPuHXO 11.10.2018 00:16 # +1
guest8 11.10.2018 00:17 # −999
DOKTOPuHXO 11.10.2018 00:18 # +1
guest8 11.10.2018 00:19 # −999
guest8 11.10.2018 04:30 # 0
Elvenfighter 11.10.2018 11:59 # +2
bormand 11.10.2018 12:47 # +1
Elvenfighter 11.10.2018 13:41 # +1
Но все же != зарплата часть суммарная большая
guest8 11.10.2018 13:02 # 0
bormand 11.10.2018 13:57 # +3
Desktop 11.10.2018 14:01 # +1
roman-kashitsyn 11.10.2018 16:58 # +4
Такое нужно писать исключительно на хаскеле, иначе так и зашипят в прод как есть без переписывания.
Elvenfighter 11.10.2018 11:54 # +3
Elvenfighter 11.10.2018 11:57 # +2
1. Perl: First Appeared December 18, 1987
2. Pascal: First appeared 1970
Да перл еще сопли на стенке пальцем размазывал, когда на пацкале уже говномесили забористый Ънтерпрайзный бойлерплейт
roman-kashitsyn 11.10.2018 00:24 # +2
«Common Lisp» (стандарту уже 24 года). Есть куча довольно старого кода на нём, которая прекрасно компилируется новыми компиляторами и не требует никакой поддержки.
Это вам не какой-нибудь «Rust».
guest8 11.10.2018 00:34 # 0
guest8 11.10.2018 00:39 # +1
guest8 11.10.2018 00:47 # +1
guest8 11.10.2018 01:29 # +2
guest8 11.10.2018 01:31 # +2
guest8 11.10.2018 02:52 # +1
guest8 11.10.2018 04:36 # +1
guest8 11.10.2018 08:57 # 0
guest8 11.10.2018 09:17 # −1
guest8 11.10.2018 09:10 # +2
guest8 11.10.2018 09:20 # −1
bormand 11.10.2018 07:08 # +2
guest8 11.10.2018 09:15 # +1
Desktop 06.02.2021 01:12 # 0
если заминусовать комментарий с рейтингом -999, то может получиться смешно
guest6 06.02.2021 01:15 # 0
Desktop 06.02.2021 01:21 # 0
bormand 06.02.2021 01:22 # −1
CBuHOKYP 06.02.2021 22:03 # 0
OlegUP 10.10.2018 21:49 # +1
Когда я работал на заводе -- мы юзали Perl.
И язык этот во сто крат интересней всяких там педонов.
Поясни, почему петля будет бесконечной?
guest8 10.10.2018 21:56 # 0
OlegUP 11.10.2018 00:47 # +1
guest8 11.10.2018 00:51 # 0
bormand 11.10.2018 07:12 # +1
Elvenfighter 11.10.2018 12:08 # +1
Если коротко -- each == говно и связывает свой итератор с обьектом-аргументом.
Если развернуто: http://blogs.perl.org/users/rurban/2014/04/do-not-use-each.html
guest8 04.11.2018 03:37 # 0
JlEOHuD_Ky4Ma 10.10.2018 21:52 # +2
guest8 10.10.2018 21:57 # 0
guest8 26.12.2018 03:12 # −1
guest8 27.12.2018 04:05 # −1
DypHuu_niBEHb 30.10.2019 03:26 # 0
``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).
Кокок, я прошел собеседование?
DypHuu_niBEHb 30.10.2019 03:29 # 0
ну и конечно же вот верная версия
либо
guest8 30.10.2019 03:47 # −1
DypHuu_niBEHb 30.10.2019 03:52 # 0
Desktop 06.02.2021 01:15 # 0