Какая разница между моим ($ variableName) и my $variableName в Perl?

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

Ответ 1

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

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.

Ответ 2

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

Описание:

   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

Ответ 3

Короткий ответ заключается в том, что круглые скобки заставляют контекст списка использовать в левой части =.

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

Ответ 4

Как и в других ответах и ​​комментариях, использование скобок предоставляет контекст списка для переменной. Ниже приведен фрагмент кода, который дает некоторое объяснение, используя функцию perl split.

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";

код >