Что означает @_ в Perl? - PullRequest
       18

Что означает @_ в Perl?

82 голосов
/ 30 декабря 2010

Что означает @_ в Perl?

Ответы [ 9 ]

111 голосов
/ 30 декабря 2010

perldoc perlvar - первое место для проверки любой специальной переменной Perl.

Цитирование:

@_: В подпрограмме массив @_ содержит параметры, переданные этой подпрограмме.

Более подробная информация может бытьнаходится в perldoc perlsub (подпрограммы Perl) , связанные с perlvar:

Все передаваемые аргументы отображаются в массиве @_.

Следовательно, если вы вызываете функцию с двумя аргументами, они будут храниться в $_[0] и $_[1].

Массив @_ представляет собой локальный массив , но его элементами являются псевдонимы для фактических скалярных параметров .В частности, если обновляется элемент $ _ [0], обновляется соответствующий аргумент (или возникает ошибка, если он не обновляется).

Если аргумент является элементом массива или хеша, который не существовал при вызове функции, этот элемент создается только тогда, когда (и если) он изменен или взята ссылка на него.(Некоторые более ранние версии Perl создавали элемент независимо от того, был ли ему присвоен элемент.) Присвоение целому массиву @_ удаляет этот псевдоним и не обновляет никакие аргументы.

24 голосов
/ 30 декабря 2010

Обычно вы расширяете параметры, передаваемые в sub , используя переменную @_:

sub test{
  my ($a, $b, $c) = @_;
  ...
}

# call the test sub with the parameters
test('alice', 'bob', 'charlie');

Это способ, который, как утверждают, является правильным perlcritic .

10 голосов
/ 31 декабря 2010

Вопрос был в том, что @_ означает в Perl. Ответ на этот вопрос заключается в том, что, поскольку $_ означает это в Perl, @_ аналогично означает они .

Никто, кажется, не упомянул этот критический аспект его значение , а также их .

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

У них обычно есть номинальные антецеденты, хотя и не всегда.

8 голосов
/ 30 декабря 2010

Первое попадание при поиске для perl @_ говорит this :

@ _ - список входящих параметров для подпрограммы.

У этого также есть более длинное и более подробное объяснение того же самого.

5 голосов
/ 30 декабря 2010

В большинстве случаев вы также можете использовать shift для отдельных переменных:

$var1 = shift;

Это тема, в которой вам следует продолжить исследование, поскольку в Perl есть несколько интересных способов доступа к внешней информации внутри подпрограммы..

5 голосов
/ 30 декабря 2010

Все «специальные переменные» Perl перечислены на странице документации perlvar .

2 голосов
/ 18 июля 2013

Также, если функция возвращает массив, но функция вызывается без присвоения возвращаемых данных какой-либо переменной, как показано ниже.Здесь вызывается split (), но он не назначен ни одной переменной.Мы можем получить доступ к его возвращенным данным позже через @_:

$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);

print @_[0]; # 'Mr.Bond'

Это разделит строку $str и установит массив @_.

1 голос
/ 22 февраля 2014

@ используется для массива.

В подпрограмме или при вызове функции в Perl вы можете передать список параметров.В этом случае @_ может использоваться для передачи списка параметров в функцию:

sub Average{

    # Get total number of arguments passed.
    $n = scalar(@_);
    $sum = 0;

    foreach $item (@_){

        # foreach is like for loop... It will access every
        # array element by an iterator
        $sum += $item;
    }

    $average = $sum / $n;

    print "Average for the given numbers: $average\n";
}

Вызов функции

Average(10, 20, 30);

Если вы наблюдаете приведенный выше код, см. foreach $item(@_) строка ... Здесь передается входной параметр.

0 голосов
/ 19 сентября 2017

Никогда не пытайтесь редактировать переменную @_ !!!! Они не должны быть затронуты .. Или вы получите какой-то неожиданный эффект. Например ...

my $size=1234;
sub sub1{
  $_[0]=500;
}
sub1 $size;

До вызова sub1 $ размер содержит 1234. Но после 500 (!!), поэтому вы не редактируете это значение !!! Вы можете передать два или более значений и изменить их в подпрограмме, и все они будут изменены! Я никогда не видел этот эффект описанным. Программы, которые я видел, также оставляют массив @_ доступным только для чтения. И только то, что вы можете безопасно передать переменную, не изменила внутреннюю подпрограмму Вы всегда должны делать это:

sub sub2{
  my @m=@_;
  ....
}

присваивает @_ переменным локальной подпрограммы и затем работает с ними. Также в некоторых глубоко рекурсивных алгоритмах, которые возвращают массив, вы можете использовать этот подход для уменьшения памяти, используемой для локальных переменных. Только если вернуть @_ массив то же самое.

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