Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

$var1 = shift;

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

Ответ 7

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

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

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

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

Ответ 8

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

В подпрограмме или при вызове функции в 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(@_)... Здесь он передает входной параметр.

Ответ 9

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

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

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

sub sub2{
  my @[email protected]_;
  ....
}

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