Pull to refresh

Я просто оставлю это здесь

Reading time3 min
Views8.5K
Я не ставлю цель обо очернить Перл. Я люблю Перл.
Просто надо различать список и массив в Перле.

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): Добавил пример унарным минусом.
Tags:
Hubs:
-2
Comments39

Articles

Change theme settings