Pull to refresh

Comments 39

Расценивать как попытку упрекнуть язык в сложности?
Автор открыл для себя разницу между списком и массивом? Да, в скалярном контексте они ведут себя по разному. Для полноты картины можно добавить пример с возвращаемыми параметрами функции. Но это все азы. В perl'е есть более страшные грабли.
спасибо, не все знают эту разницу.
я ещё добавил 2 примера. Я случайно выложил раньше времени неполную версию
В perl'е есть более страшные грабли.

можете рассказать?
Например, perl не всегда верно трактует фигурные скобки, причем иногда сложно предсказать какой будет результат:

perl -e 'map { $_ => 1 } @ARGV'
vs
perl -e 'map { "$_" => 1 } @ARGV'
Так я о том и пишу, что perl не всегда верно догадывается, что от него хотят, и ему нужно подсказать.
если не выпендриваться, то почти всегда будет верно догадываться
При чем здесь «не выпендриваться»? Объясните в какой из двух конструкций выше есть «выпендривание»? На всякий случай объясню, вторая из них с точки зрения perl имеет синтаксическую ошибку на всех версиях интерпретатора, которые сейчас под рукой.
вторая из них с точки зрения perl имеет синтаксическую ошибку на всех версиях интерпретатора, которые сейчас под рукой.

потому что символы {" можно посчитать за начало ключа хэша.

в этом примере нет выпендривания, я вообще имел в виду.
Вы хотите доказать мне что это не грабли? Или Вы хотите оправдать perl? В чем посыл? Если для Вас это не грабли — замечательно. Мне писать об этом не нужно.
UFO just landed and posted this here
Что вы привязались к конкретному примеру? Можно его переделать:

perl -e 'map { "-$_" => $_ } @ARGV'
vs
perl -e 'map { "-".$_ => $_ } @ARGV'
UFO just landed and posted this here
Что Вы хотете мне показать? Я прекрасно знаю как это обойти. Но это сильно не нормальное поведение. Если для Вас нормальное — замечательно. У меня другое мнение.

так Вы любите Перл или как?)
Это не баг, это фича :)
perl -MData::Dumper -le "%a = map { $_ => 1 } @ARGV; print Dumper \%a" test
$VAR1 = {
'test' => 1
};

perl -MData::Dumper -le "%a = map { "$_" => 1 } @ARGV; print Dumper \%a" test
$VAR1 = {
'test' => 1
};

в чём разница?
Замените для начала двойные кавычки на апострофы, чтобы шелл не интеполировал $_, потом делитесь своими откровениями.
На всякий случай:
echo "$_" test
спасибо, я проверял под Виндой, там только двойные возможны

perl -MData::Dumper -le '%a = map { "$_" => 1 } @ARGV; print Dumper \%a' test
Not enough arguments for map at -e line 1, near "} @ARGV"
syntax error at -e line 1, near "} @ARGV"
Execution of -e aborted due to compilation errors.
Только вот зачем эти грабли для себя же и раскладывать по проекту. Чем меньше запредельных возможностей вы используете, тем меньше потенциальных граблей :)
[hope mode on]
Стали минусовать, добавил фразу «Я не оставлю цель очернить Перл...». Надеюсь, пронесёт
[/hope mode on]
Эм… Типа я никогда не оставлю цель очернить Перл? )))
Блин, я думал, Вы пошутили, но после того, как об этом указал второй человек, я заметил ошибку.
На YAPC::Europe был блиц–доклад по теме — «brackets versus comma by Damien Krotkine». Просите слайды у автора.
UFO just landed and posted this here
Perl — язык для взрослых ;)

Есть еще очень много интересных и загадочных граблей, но часть из них — изюм высшей пробы :)
добавил фразу «Я не ставлю цель...»

и
Я не оставлю цель очернить Перл

— кардинально разный смысл :)
О сколько нам открытий чудных
Готовит юзер-мануал.
Только начал изучать — затягивает. Есть в нём что-то такое, что называется «сделано с душой».
Вот оно! Вот оно!!!
#!/usr/bin/perl
use strict;
my @a = ('Г', 'л','а','в','н','ы','й','В','о','п','р','о','с','О','Ж','и','з','н','и',',','В','с','е','л','е','н','н','о','й','И','В','с','я','к','о','м','Т','а','к','о','м','?');
my $x = @a;
print $x;
оно же, но короче:
perl -E 'use utf8; say length("главныйвопросожизни,вселеннойивсякомтаком?")'
#!/usr/bin/perl
$\ = "\n";
my $x = ('a', 'b', 'c');
print "x = $x";
my $x = @{['a', 'b', 'c']};
print "x = $x";
my $x = (@{['a', 'b', 'c']});
print "x = $x"; 


Давайте уж будем честными:
my $x = ('a', 'b', 'c');     # списковый контекст, то есть _работа в контексте_ списка
my $x = @{['a', 'b', 'c']};  # разыменовывание ссылки на _массив_


То есть вы пытаетесь сравнивать тёплое с мягким. Списковый контекст — это ещё не массив. Массив появляется когда вы используя списковый контекст присваиваете значения переменной соответствующего типа. Потому корректным было бы такое сравнение:
#!/usr/bin/perl
$\ = "\n";
my @a = ('a', 'b', 'c');    # создали массив
my $x = @a;                 # работаем с массивом
print "x = $x";
my $x = @{['a', 'b', 'c']}; # разыменовываем ссылку на анонимный массив 
                            # и работаем с как с обычным массивом
print "x = $x";


Вывод:

x = 3
x = 3


Круглые скобки в перле используются много для чего: как для создания списков так и для группировки логических выражений, а потому не обязаны вести себя как массив.
В случае
$x = (1,2,3)
работает не «список в скалярном контексте», а оператор "," в скалярном контексте:

Binary "," is the comma operator. In scalar context it evaluates its left argument, throws that value away, then evaluates its right argument and returns that value. This is just like C's comma operator.


Поэтому всё логично, мы получаем последний элемент
Sign up to leave a comment.

Articles