В чем разница между my ($variableName)
и my $variableName
в Perl? Что делать в круглых скобках?
Какая разница между моим ($ 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";
код >