Що означає @_
Perl?
Відповіді:
perldoc perlvar - це перше місце, де потрібно перевірити наявність будь-якої спеціальної інформації про змінну Perl.
Цитування:
@_
: Всередині підпрограми масив@_
містить параметри, передані цій підпрограмі.
Детальніше можна знайти в perldoc perlsub (підпрограмах Perl), пов’язаних із perlvar:
Будь-які передані аргументи відображаються в масиві
@_
.Отже, якщо ви викликали функцію з двома аргументами, вони зберігалися б у
$_[0]
та$_[1]
.Масив
@_
є локальним масивом , але його елементи є псевдонімами для фактичних скалярних параметрів . Зокрема, якщо елемент $ _ [0] оновлено, відповідний аргумент оновлюється (або виникає помилка, якщо його не можна оновити).Якщо аргумент - це масив або хеш-елемент, який не існував під час виклику функції, цей елемент створюється лише тоді, коли (і якщо) він модифікується або береться посилання на нього. (Деякі попередні версії Perl створювали елемент незалежно від того, призначений йому елемент.) Призначення всьому масиву @_ видаляє це псевдонім і не оновлює жодних аргументів.
Зазвичай ви розширюєте параметри, передані до підпрограми, використовуючи @_
змінну:
sub test{
my ($a, $b, $c) = @_;
...
}
# call the test sub with the parameters
test('alice', 'bob', 'charlie');
Перлкритик стверджував, що це правильно .
perlcritic
, особисто я вважаю, що це найкраще для функції, але для методу це корисно для shift
самостійного посилання, а потім розпакуйте @_
масив. Це дає зрозуміти, що це метод І що метод приймає певні параметри
Перше потрапляння в пошукperl @_
зазначає це :
@_ - це список вхідних параметрів до підпункту.
Він також має більш довге та детальне пояснення того самого.
Питання було в тому, що @_
означає Perl. Відповідь на це питання полягає в тому, наскільки $_
засіб це в Perl, так @_
само означає , що вони .
Здається, ніхто не згадував про цей критичний аспект його значення - як і про їхній .
Отже, вони обидва використовуються як займенники, а іноді і як тематизатори.
Зазвичай вони мають номінальні попередні ознаки, хоча і не завжди.
Ви також можете використовувати shift для окремих змінних у більшості випадків:
$var1 = shift;
Це тема, в якій вам слід продовжити дослідження, оскільки Perl має ряд цікавих способів доступу до зовнішньої інформації всередині вашої підпрограми.
Також якщо функція повертає масив, але функція викликається без присвоєння повернутих даних будь-якій змінній, як показано нижче. Тут викликається split (), але він не призначається жодній змінній. Ми можемо отримати доступ до повернутих даних пізніше через @_:
$str = "Mr.Bond|Chewbaaka|Spider-Man";
split(/\|/, $str);
print @_[0]; # 'Mr.Bond'
Це розділить рядок $str
і встановить масив @_
.
@
використовується для масиву.
У підпрограмі або коли ви викликаєте функцію в 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
. Тому я відредагував вашу підфункцію.
Ніколи не намагайтеся редагувати змінну @_ !!!! Їх не можна чіпати .. Або ви отримуєте якийсь не підозрюваний ефект. Наприклад...
my $size=1234;
sub sub1{
$_[0]=500;
}
sub1 $size;
Перед викликом розмір sub1 $ містить 1234. Але після 500 (!!) Отже, Ви не редагуєте це значення !!! Ви можете передати два або більше значень і змінити їх у підпрограмі, і всі вони будуть змінені! Я ніколи не бачив описаного цього ефекту. Програми, які я бачив, також залишають масив @_ лише для читання. І лише те, що ви можете безпечно передавати змінну, не змінювали внутрішню підпрограму. Ви завжди повинні робити це:
sub sub2{
my @m=@_;
....
}
призначити @_ локальним змінним процедури підпрограми і далі працювати з ними. Також у деяких глибоких рекурсивних алгоритмах, що повертають масив, ви можете використовувати цей підхід для зменшення пам'яті, що використовується для локальних варів. Тільки якщо масив return__ однаковий.