Что означает @ in Perl?

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

9 ответов


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

цитирую:

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


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

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

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

вот как утверждалось, что это правильно perlcritic.


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

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

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


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

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

Они, следовательно, оба используются как местоимения, или иногда как topicalizers.

Они, как правило, имеют номинальную прошлое, хотя и не всегда.


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


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

$var1 = shift;

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


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

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

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

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


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

в подпрограмму, или при вызове функции в Perl, вы можете передать список параметров. В таком случае ...--3--> is можно использовать для передачи списка параметров функции:

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(@_) линии... Здесь он передает входной параметр.


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

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

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

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

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