Що означає @_ у Perl?


Відповіді:


118

perldoc perlvar - це перше місце, де потрібно перевірити наявність будь-якої спеціальної інформації про змінну Perl.

Цитування:

@_: Всередині підпрограми масив @_містить параметри, передані цій підпрограмі.

Детальніше можна знайти в perldoc perlsub (підпрограмах Perl), пов’язаних із perlvar:

Будь-які передані аргументи відображаються в масиві @_.

Отже, якщо ви викликали функцію з двома аргументами, вони зберігалися б у $_[0]та $_[1].

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

Якщо аргумент - це масив або хеш-елемент, який не існував під час виклику функції, цей елемент створюється лише тоді, коли (і якщо) він модифікується або береться посилання на нього. (Деякі попередні версії Perl створювали елемент незалежно від того, призначений йому елемент.) Призначення всьому масиву @_ видаляє це псевдонім і не оновлює жодних аргументів.


Дякую, я лише нещодавно звик перевіряти perldoc, і мені здалися веб-сторінки корисними: perldoc.perl.org/perlvar.html Непогано було зробити заглушку perl, яка запускає це в Інтернеті ... форматування веб-сторінки мені дуже допомагає.
aschultz

27

Зазвичай ви розширюєте параметри, передані до підпрограми, використовуючи @_змінну:

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

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

Перлкритик стверджував, що це правильно .


2
це один раз, з яким я не погоджуюсь perlcritic, особисто я вважаю, що це найкраще для функції, але для методу це корисно для shiftсамостійного посилання, а потім розпакуйте @_масив. Це дає зрозуміти, що це метод І що метод приймає певні параметри
Джоель Бергер

Ймовірно, я мав раніше користуватися / знати про PERLCritic, але ні. Дякуємо за використання у цьому прикладі. Іноді речі, на які ви посилаєтесь випадково, можуть допомогти комусь навчитися чогось абсолютно нового для них.
aschultz

12

Перше потрапляння в пошукperl @_ зазначає це :

@_ - це список вхідних параметрів до підпункту.

Він також має більш довге та детальне пояснення того самого.


3
Насправді перше звернення до вашого пошуку в Google тепер веде саме на цю сторінку.
Габріель Саузерн

... сім років потому, цілу вічність в Інтернеті. Ось чому я як прив’язав до першого результату, так і процитував відповідну частину: залежно від Google було б дуже наївно.
Пісквор залишив будівлю

1
правда, це пройшло багато років потому, але все одно дратує читати відповіді, які означають, що вам слід звернутися до Google для відповіді на запитання. Це безглузда інформація для тих, хто читає відповідь в результаті гуглювання.
Габріель Саузерн

2
Так, пошук - це правильний перший крок, але не обов’язково включати інструкції щодо пошуку у свою відповідь. Це зайва інформація, яка не додає ніякої цінності, і це іронія, адже якщо хтось переходить за посиланням пошуку у вашій відповіді, це повертає їх назад, де вони почали.
Габріель Саузерн

1
всі ці відповіді "google it" так погано постаріли 😂
Остін Адамс,

11

Питання було в тому, що @_ означає Perl. Відповідь на це питання полягає в тому, наскільки $_засіб це в Perl, так @_само означає , що вони .

Здається, ніхто не згадував про цей критичний аспект його значення - як і про їхній .

Отже, вони обидва використовуються як займенники, а іноді і як тематизатори.

Зазвичай вони мають номінальні попередні ознаки, хоча і не завжди.


7

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

$var1 = shift;

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


3
Класно, хто б не дав мені голос проти просто за те, що я опублікував інший спосіб зробити подібне. Я розумію, що не відповів прямо на запитання, бо хтось уже відповів, але я запропонував альтернативну форму, яку нові програмісти perl часто бентежать.
hockfan86


2

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

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

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

Це розділить рядок $strі встановить масив @_.


1

@ використовується для масиву.

У підпрограмі або коли ви викликаєте функцію в Perl, ви можете передати список параметрів. У такому випадку за допомогою функції @_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(@_)рядок ... Тут він передає вхідний параметр.


Ти повинен завжди use strict. Тому я відредагував вашу підфункцію.
EverythingRightPlace

0

Ніколи не намагайтеся редагувати змінну @_ !!!! Їх не можна чіпати .. Або ви отримуєте якийсь не підозрюваний ефект. Наприклад...

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

Перед викликом розмір sub1 $ містить 1234. Але після 500 (!!) Отже, Ви не редагуєте це значення !!! Ви можете передати два або більше значень і змінити їх у підпрограмі, і всі вони будуть змінені! Я ніколи не бачив описаного цього ефекту. Програми, які я бачив, також залишають масив @_ лише для читання. І лише те, що ви можете безпечно передавати змінну, не змінювали внутрішню підпрограму. Ви завжди повинні робити це:

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

призначити @_ локальним змінним процедури підпрограми і далі працювати з ними. Також у деяких глибоких рекурсивних алгоритмах, що повертають масив, ви можете використовувати цей підхід для зменшення пам'яті, що використовується для локальних варів. Тільки якщо масив return__ однаковий.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.