Параметры подпрограммы Perl и параметры скалярной переменной

Как именно я могу передать как скалярные переменные, так и переменные массива в подпрограмму в Perl?

 my $currVal = 1;
 my $currValTwo = 1;
 my @currArray = ('one','two','three');
 my @currArrayTwo =('one','two','three');

 &mysub($currVal, $currValTwo,\@currArray, \@currArrayTwo);

 sub mysub() {

     # That doesn't work for the array as I only get the first element of the array
     my($inVal, $inValTwo, @inArray, @inArrayTwo) = @_;
 }

Ответ 1

Вам нужно получить их в качестве ссылок, потому что вы уже передали их в качестве ссылок (с помощью оператора \):

my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;

а затем используйте ссылки как массивы:

@{$inArray}

Ответ 2

Вы передаете аргументы в качестве ссылок, поэтому вам нужно разыгрывать их для использования значений. Будьте осторожны, хотите ли вы изменить исходный массив или нет.

sub mysub {
    my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;
    @{$inArrayTwo} = ('five','six','seven');
}

Это изменит исходный @currArrayTwo, который может быть не таким, каким вы хотите.

sub mysub {
    my($inVal, $inValTwo, $inArray, $inArrayTwo) = @_;
    my @ATwo = @{$inArrayTwo};
    @ATwo = ('five','six','seven');
}

Это скопирует значения и оставит исходный массив неповрежденным.

Кроме того, вам не нужен амперсанд перед подзаголовком, perldoc perlsub:

Если подпрограмма вызывается с использованием & form, список аргументов является необязательным, и если этот параметр опущен, массив @_ не настроен для подпрограммы: массив @_ в время вызова видимо вместо этого. Это эффективность новых пользователей возможно, пожелает избежать.

Вам не нужны пустые парсеры после вашего объявления sub. Они используются для создания прототипов, что вам не нужно делать, если вы действительно этого не хотите.

Ответ 3

Итак, например: Это оператор using для поиска в массиве:

use List::Util qw(first);

Это подзадача:

sub GetIndex($$$);

Это вызов к югу (последний параметр: значение индекса по умолчанию для возврата, если не найдено)

$searchedIndex = GetIndex(\@theArr, "valuesearched", 1);

Это подпрограмма:

sub GetIndex($$$)
{
    my $inArray=shift;
    my @theArray= @{$inArray};
    my $searchedTag= shift;
    my $defaultVal= shift;

    my $retVal = first { $theArray[$_] eq $searchedTag} 0 .. $#theArray;
    if ((! defined $retVal)|| ($retVal<0)||($retVal>@theArray))
    {
        $retVal = $defaultVal;
    }
    return $retVal;
}