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

62

В чем смысл @_ в Perl?

Теги:
variables

9 ответов

91
Лучший ответ

perldoc perlvar - первое, что нужно проверить для любой информации переменной Perl с особыми именами.

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

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

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

Любые аргументы, переданные в массив @_.

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

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

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

  • 0
    Спасибо, я только недавно привык к проверке perldoc и нашел полезными веб-страницы: perldoc.perl.org/perlvar.html Было неплохо создать заглушку perl, которая запускает это в сети ... форматирование веб-страницы мне очень помогает.
19

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

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

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

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

  • 0
    это один раз, когда я не согласен с perlcritic , лично я считаю, что это лучше всего подходит для функции, но для метода полезно shift ссылку на себя, а затем распаковать массив @_ . Это проясняет, что это метод И что метод принимает определенные параметры
  • 0
    Я, вероятно, должен был использовать / знать о PERLCritic раньше, но я не сделал. Спасибо за использование этого в этом примере. Иногда вещи, на которые вы ссылаетесь, могут помочь кому-то узнать что-то совершенно новое для них.
8

Первый удар поиск perl @_ говорит this:

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

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

  • 1
    Фактически, первое попадание в вашем поиске Google теперь ссылается на эту страницу.
  • 0
    ... семь лет спустя, вечность в интернете. Вот почему я и ссылался на первый результат, и цитировал соответствующую часть: зависеть только от Google было бы очень наивно.
Показать ещё 5 комментариев
7

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

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

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

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

5

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

$var1 = shift;

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

  • 3
    Круто, кто бы ни дал мне отрицательный голос просто за публикацию другого способа сделать подобное. Я понимаю, что не отвечал на вопрос напрямую, потому что кто-то уже ответил, но я предложил альтернативную форму, с которой начинающие программисты на Perl часто путаются.
5

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

1

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

В подпрограмме или при вызове функции в 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
    Вы должны всегда use strict . Поэтому я отредактировал вашу подфункцию.
1

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

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

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

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

0

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню