В чем разница использования специальных переменных $ _ и @_ в Perl? - PullRequest
12 голосов
/ 01 февраля 2012

Пожалуйста, объясните, в чем именно разница $_ и @_ в Perl. Когда использовать который, приведенный в примере кода.

Ответы [ 4 ]

24 голосов
/ 01 февраля 2012

В подпрограмме массив @_ предоставляет аргументы, переданные данной подпрограмме.Например:

use strict;
use warnings;

sub print_em
{
  foreach my $arg (@_)
  {
    print "You passed in $arg.\n";
  }
}

print_em("foo","bar","baz");

Выходные данные

You passed in foo.
You passed in bar.
You passed in baz.

Скаляр $_ обычно используется в качестве переменной в цикле.Например:

use strict;
use warnings;

# Note that we are not declaring a variable
# that takes on the values 1 through 5.
foreach(1..5) 
{
  print "$_\n";
}

Вывод:

1
2
3
4
5

Аналогично, мы могли бы слегка переписать подпрограмму print_em выше как

sub print_em
{
  foreach(@_)
  {
    print "You passed in $_.\n";
  }
}

или дажекак более компактный

sub print_em{ print "You passed in $_.\n" foreach(@_);}

Переменная $_ также может использоваться в качестве «аргумента по умолчанию» для определенных функций.Например:

use strict;
use warnings;

$_="foobar";

if(/bar/) #We do not have to write $_=~/bar/
{
  print "matched!\n";
}

, который, конечно, выводит matched!.

. Посмотрите на perldoc perlvar для получения дополнительной информации об этих и других Perl "магические переменные ".

8 голосов
/ 01 февраля 2012

Ответ Джека Мани охватывает ваш точный вопрос, но я также хотел кое-что отметить: вас не должно одурачить только часть имени переменной. Сигнал также имеет значение. $_ и @_ - абсолютно разные переменные, как $foo и @foo, а также $bar и %bar. Perl хранит их полностью отдельно друг от друга.

3 голосов
/ 01 февраля 2012

Один из наиболее распространенных примеров связан с вводом / выводом.Этот код ...

while(<>)
{
  chomp;
  print if(m/^chr1/);
}

... функционально эквивалентен этому коду.

while(my $line = <STDIN>)
{
  chomp($line);
  print($line) if($line =~ m/^chr1/);
}

Каждый раз, когда у вас есть цикл, заполняется переменная $_, но естьтакже более явный синтаксис.Этот код ...

foreach(@a)
{
  print;
  chomp;
  push(@b, $_)
}

... функционально эквивалентен этому коду.

foreach my $value(@a)
{
  print($value);
  chomp($value);
  push(@b, $value);
}

При работе с $_ и другими магическими переменными следует помнить, что ониможет быть довольно загадочным для нового программиста.Со временем я все реже и реже использовал их в пользу более явного синтаксиса, который (будем надеяться) облегчит другим понимание цели кода.

1 голос
/ 01 февраля 2012

Ни $_, ни @_ по своей сути не являются особенными.Помимо того, что они глобальные, они являются полностью нормальными переменными.Они не волшебные.Ничего особенного не происходит, когда кто-то присваивает им или читает из них.

Причина, по которой @_ используется так часто, заключается в том, что Perl размещает аргументы функции.Если вы хотите, чтобы аргументы передавались вашему сабвуферу, вам нужно получить доступ к @_.

 sub f {
    my ($x, $y) = @_;
    ...
 }

. Причина, по которой $_ используется так часто, заключается в том, что некоторые операторы Perl назначают ему по умолчаниюи другие используют его значение в качестве значения по умолчанию для своих аргументов.Это может привести к более короткому коду, если вы его охватите, но у вас никогда не будет для использования .

for my $x (@x) { say $x; }
   vs
for (@x) { say; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...