Комментарии 39
Расценивать как попытку упрекнуть язык в сложности?
+1
Автор открыл для себя разницу между списком и массивом? Да, в скалярном контексте они ведут себя по разному. Для полноты картины можно добавить пример с возвращаемыми параметрами функции. Но это все азы. В perl'е есть более страшные грабли.
+16
спасибо, не все знают эту разницу.
+1
я ещё добавил 2 примера. Я случайно выложил раньше времени неполную версию
+1
В perl'е есть более страшные грабли.
можете рассказать?
+1
Например, perl не всегда верно трактует фигурные скобки, причем иногда сложно предсказать какой будет результат:
vs
perl -e 'map { $_ => 1 } @ARGV'
vs
perl -e 'map { "$_" => 1 } @ARGV'
0
perldoc -f map
=> perl -e 'map { +"$_" => 1 } @ARGV'
=> perl -e 'map { +"$_" => 1 } @ARGV'
0
Так я о том и пишу, что perl не всегда верно догадывается, что от него хотят, и ему нужно подсказать.
0
если не выпендриваться, то почти всегда будет верно догадываться
+1
При чем здесь «не выпендриваться»? Объясните в какой из двух конструкций выше есть «выпендривание»? На всякий случай объясню, вторая из них с точки зрения perl имеет синтаксическую ошибку на всех версиях интерпретатора, которые сейчас под рукой.
0
вторая из них с точки зрения perl имеет синтаксическую ошибку на всех версиях интерпретатора, которые сейчас под рукой.
потому что символы {" можно посчитать за начало ключа хэша.
в этом примере нет выпендривания, я вообще имел в виду.
0
НЛО прилетело и опубликовало эту надпись здесь
Это не баг, это фича :)
+1
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
};
в чём разница?
$VAR1 = {
'test' => 1
};
perl -MData::Dumper -le "%a = map { "$_" => 1 } @ARGV; print Dumper \%a" test
$VAR1 = {
'test' => 1
};
в чём разница?
0
Замените для начала двойные кавычки на апострофы, чтобы шелл не интеполировал $_, потом делитесь своими откровениями.
На всякий случай:
На всякий случай:
echo "$_" test
0
Только вот зачем эти грабли для себя же и раскладывать по проекту. Чем меньше запредельных возможностей вы используете, тем меньше потенциальных граблей :)
+1
[hope mode on]
Стали минусовать, добавил фразу «Я не оставлю цель очернить Перл...». Надеюсь, пронесёт
[/hope mode on]
Стали минусовать, добавил фразу «Я не оставлю цель очернить Перл...». Надеюсь, пронесёт
[/hope mode on]
+1
На YAPC::Europe был блиц–доклад по теме — «brackets versus comma by Damien Krotkine». Просите слайды у автора.
+1
НЛО прилетело и опубликовало эту надпись здесь
Фак мой мозг, Дэвид Блэйн!
-2
Perl — язык для взрослых ;)
Есть еще очень много интересных и загадочных граблей, но часть из них — изюм высшей пробы :)
Есть еще очень много интересных и загадочных граблей, но часть из них — изюм высшей пробы :)
+3
добавил фразу «Я не ставлю цель...»
и
Я не оставлю цель очернить Перл
— кардинально разный смысл :)
0
О сколько нам открытий чудных
Готовит юзер-мануал.
Готовит юзер-мануал.
+3
Только начал изучать — затягивает. Есть в нём что-то такое, что называется «сделано с душой».
0
Вот оно! Вот оно!!!
#!/usr/bin/perl
use strict;
my @a = ('Г', 'л','а','в','н','ы','й','В','о','п','р','о','с','О','Ж','и','з','н','и',',','В','с','е','л','е','н','н','о','й','И','В','с','я','к','о','м','Т','а','к','о','м','?');
my $x = @a;
print $x;
#!/usr/bin/perl
use strict;
my @a = ('Г', 'л','а','в','н','ы','й','В','о','п','р','о','с','О','Ж','и','з','н','и',',','В','с','е','л','е','н','н','о','й','И','В','с','я','к','о','м','Т','а','к','о','м','?');
my $x = @a;
print $x;
0
#!/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
Круглые скобки в перле используются много для чего: как для создания списков так и для группировки логических выражений, а потому не обязаны вести себя как массив.
0
В случае
Поэтому всё логично, мы получаем последний элемент
$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.
Поэтому всё логично, мы получаем последний элемент
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Я просто оставлю это здесь