Массив подпрограмм Perl и параметры скалярных переменных - PullRequest
11 голосов
/ 09 июня 2011

Как именно я могу передать и скалярные переменные, и переменные массива в подпрограмму в 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) = @_;
 }

Ответы [ 3 ]

15 голосов
/ 09 июня 2011

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

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

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

@{$inArray}
6 голосов
/ 09 июня 2011

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

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 :

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

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

0 голосов
/ 12 марта 2013

Так, например: Это оператор использования для поиска чего-либо в массиве:

use List::Util qw(first);

Это вложенное объявление:

sub GetIndex($$$);

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

$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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...