Я не ставлю цель обо очернить Перл. Я люблю Перл.
Просто надо различать список и массив в Перле.
Вывод:
Вывод:
Вывод:
Вывод:
Вывод:
Вывод:
Я не ставлю цельобо очернить Перл. Я люблю Перл.
Подробности здесь: perldoc perldata, читать с «List value constructors»
Оффтоп, из бесед с разными людьми узнал ещё пару примеров:
Вывод:
в хэшах имя ключа не обязательно брать в кавычки, оно сразу представляется как строка, унарный плюс же вычисляет операцию +shift, то есть $_[x], где x — индекс в массиве @_
Это эквивалентно
оператор s позволяет заменять / разделители на другие символы, здесь выбран символ g
то есть это s///gg;, что в свою очередь эквивалентно просто s///g; Очевидно здесь стоит пробел после s, чтобы перл различил этот оператор от вызова некоей функции sggggg; Также очевидно, что пробел не может быть разделителем вместо /
Опять же напоминаю про модуль O=Deparse, про которого я говорил в своей статье Однострочные программы на Perl, который всё покажет:
Вывод:
Unary "-" performs arithmetic negation if the operand is numeric. If the operand is an identifier, a string consisting of a minus sign concatenated with the identifier is returned.
Минус работает как минус, если стоит перед числом. Если стоит перед идентификатором, то возвращается строка, состоящая из минуса и идентификатора.
UPD: Наверное по началу меня не так поняли и стали минусовать, добавил фразу «Я не ставлю цель...»
UPD 2:
Про последний пример. В документации написано
«List assignment in scalar context returns the number of elements
produced by the expression on the right side of the assignment»
то есть если списку что-то присваиваем, то вернётся количество элементов, которые присваиваем списку.
в $x положится количество элементов, которые возвращает функция f()
UPD 3: Вижу, что люди раскрыли минусомёты, так что, скорее всего, я в течение дня (возможно в 15:00) помещю статью в черновики, дабы не лишиться кармы.
Если статья понравилась, сохраните её.
UPD 4: С кармой не так всё плохо, благодарю тех, кто поддержал меня, добавил ещё примеров с hash{shift} и s ggggg;
UPD 5(28.08.2012): Добавил пример унарным минусом.
Просто надо различать список и массив в Перле.
use Perl or die;
#!/usr/bin/perl
use strict;
my $x = ('a', 'b');
print $x;
Вывод:
b
#!/usr/bin/perl
use strict;
my @a = ('a', 'b');
my $x = @a;
print $x;
Вывод:
2
#!/usr/bin/perl
my @a = ('a', 'b');
my ($x) = @a;
print $x;
Вывод:
a
#!/usr/bin/perl
my @a = ('a', 'b');
print scalar @a;
Вывод:
2
#!/usr/bin/perl
print scalar ('a', 'b');
Вывод:
b
#!/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";
Вывод:
x = c
x = 3
x = 3
#!/usr/bin/perl
use strict;
my $x;
my $y;
$y = ($x = ('a', 'b', 'c'));
print "x = $x\n";
print "y = $y\n";
x = с
y = с
#!/usr/bin/perl
use strict;
my $x;
my $y;
$y = (($x) = ('a', 'b', 'c'));
print "x = $x\n";
print "y = $y\n";
x = a
y = 3
Я не ставлю цель
use Perl or die;
Подробности здесь: perldoc perldata, читать с «List value constructors»
Оффтоп, из бесед с разными людьми узнал ещё пару примеров:
#!/usr/bin/perl
use strict;
use Data::Dumper;
sub test1 {
my %hash;
$hash{shift} = 1;
print Dumper \%hash;
}
sub test2 {
my %hash;
$hash{+shift} = 1;
print Dumper \%hash;
}
test1('test');
test2('test');
Вывод:
$VAR1 = { 'shift' => 1 }; $VAR1 = { 'test' => 1 };
в хэшах имя ключа не обязательно брать в кавычки, оно сразу представляется как строка, унарный плюс же вычисляет операцию +shift, то есть $_[x], где x — индекс в массиве @_
s ggggg;
Это эквивалентно
s///g;
оператор s позволяет заменять / разделители на другие символы, здесь выбран символ g
то есть это s///gg;, что в свою очередь эквивалентно просто s///g; Очевидно здесь стоит пробел после s, чтобы перл различил этот оператор от вызова некоей функции sggggg; Также очевидно, что пробел не может быть разделителем вместо /
Опять же напоминаю про модуль O=Deparse, про которого я говорил в своей статье Однострочные программы на Perl, который всё покажет:
perl -MO=Deparse -le "s ggggg;"
BEGIN { $/ = "\n"; $\ = "\n"; } s///g; -e syntax OK
#!/usr/bin/perl
use strict;
use Data::Dumper;
use constant key => 1;
my %hash;
$hash{key} = 1;
print Dumper \%hash;
my %hash2;
$hash2{+key} = 1;
print Dumper \%hash2;
my %hash3;
$hash3{-key} = 1;
print Dumper \%hash3;
Вывод:
$VAR1 = { 'key' => 1 }; $VAR1 = { '1' => 1 }; $VAR1 = { '-key' => 1 };
Unary "-" performs arithmetic negation if the operand is numeric. If the operand is an identifier, a string consisting of a minus sign concatenated with the identifier is returned.
Минус работает как минус, если стоит перед числом. Если стоит перед идентификатором, то возвращается строка, состоящая из минуса и идентификатора.
UPD: Наверное по началу меня не так поняли и стали минусовать, добавил фразу «Я не ставлю цель...»
UPD 2:
Про последний пример. В документации написано
«List assignment in scalar context returns the number of elements
produced by the expression on the right side of the assignment»
то есть если списку что-то присваиваем, то вернётся количество элементов, которые присваиваем списку.
$x = (($foo,$bar) = f());
в $x положится количество элементов, которые возвращает функция f()
UPD 3: Вижу, что люди раскрыли минусомёты, так что, скорее всего, я в течение дня (возможно в 15:00) помещю статью в черновики, дабы не лишиться кармы.
Если статья понравилась, сохраните её.
UPD 4: С кармой не так всё плохо, благодарю тех, кто поддержал меня, добавил ещё примеров с hash{shift} и s ggggg;
UPD 5(28.08.2012): Добавил пример унарным минусом.