В чем разница между моим ($ variableName) и моим $ variableName в Perl? - PullRequest
23 голосов
/ 24 января 2010

В чем разница между my ($variableName) и my $variableName в Perl? Что в скобках делать?

Ответы [ 4 ]

20 голосов
/ 24 января 2010

Важный эффект - когда вы инициализируете переменную одновременно с объявлением:

my ($a) = @b;   # assigns  $a = $b[0]
my $a = @b;     # assigns  $a = scalar @b (length of @b)

В другой раз это важно, когда вы объявляете несколько переменных.

my ($a,$b,$c);  # correct, all variables are lexically scoped now
my $a,$b,$c;    # $a is now lexically scoped, but $b and $c are not

Последнее утверждение выдаст вам ошибку, если вы use strict.

5 голосов
/ 24 января 2010

Короткий ответ - это то, что контекст списка принудительных скобок используется в левой части =.

Каждый из остальных ответов указывает на конкретный случай, когда это имеет значение. Действительно, вы должны прочитать perlfunc , чтобы лучше понять, как функции действуют по-разному при вызове в контексте списка, в отличие от скалярного контекста.

5 голосов
/ 24 января 2010

Пожалуйста, посмотрите на perdoc perlsub для получения дополнительной информации об операторе my. Вот небольшая выдержка:

Справка:

   my $foo;            # declare $foo lexically local
   my (@wid, %get);    # declare list of variables local
   my $foo = "flurp";  # declare $foo lexical, and init it
   my @oof = @bar;     # declare @oof lexical, and init it
   my $x : Foo = $y;   # similar, with an attribute applied
2 голосов
/ 24 января 2010

Поскольку другие ответы и комментарии объясняют использование скобок, предоставьте список переменных для переменной. Ниже приведен фрагмент кода, который дает более подробное объяснение, используя функцию perl split.
</p> <pre><code>use strict; my $input = "one:two:three:four"; # split called in list context my ($out) = split(/:/,$input); # $out contains string 'one' #(zeroth element of the list created by split operation) print $out,"\n"; # split called in scalar context my $new_out = split(/:/,$input); # $new_out contains 4 (number of fields found) print $new_out,"\n";

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...