- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
sub mymap(&@) {
my ($code, @result) = shift;
push @result, $code->() for (@_);
return @result;
}
sub doit_map {
return {
some_key => [
map { return $_; } qw(one)
]
};
}
sub doit_mymap {
return {
some_key => [
mymap { return $_; } qw(one)
]
};
}
print Dumper({
doit_mymap => doit_mymap,
doit_map => doit_map,
});
Реализация mymap, конечно, заслуживает отдельного треда. But leave it... for time being.
Вся соль в различии возвращаемых значений. В доке конечно описано почему оно так: http://perldoc.perl.org/functions/map.html. Но негативный осадок всё-же остался.
http://ideone.com/q1HFDW
anonimb84a2f6fd141 19.11.2013 14:09 # 0
Elvenfighter 19.11.2013 21:36 # +4
anonimb84a2f6fd141 20.11.2013 11:47 # −4
Вот где говнокод.
Dummy00001 19.11.2013 19:40 # 0
Пальцем ткнешь? Лень все перечитывать.
Первый раз вижу что кто-то `return` внутри `{}` блока делает. Если убрать ретурн то вроде как бы работает как и ожидается.
Elvenfighter 19.11.2013 21:30 # +2
В то время как обычные функции получают CODEREF. Он же:
Конкретно в доке по map есть хинт: map BLOCK LIST
А в perlsyn описано что такое BLOCK: http://perldoc.perl.org/perlsyn.html#Basic-BLOCKs
Dummy00001 19.11.2013 23:46 # 0
gh0stwizard 20.11.2013 11:17 # 0
gh0stwizard 20.11.2013 11:21 # 0