#perl
#perl
Вопрос:
Как именно я могу передать как скалярные переменные, так и переменные массива в подпрограмму на Perl?
my $currVal = 1;
my $currValTwo = 1;
my @currArray = ('one','two','three');
my @currArrayTwo =('one','two','three');
amp;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. Какой массив, вы используете два?
2. Это случилось с обоими, но ответ Благовеста исправил это!
3. Я искал этот вопрос весь день. Спасибо, что задали этот вопрос!!!
Ответ №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:
Если подпрограмма вызывается с использованием формы amp; , список аргументов является необязательным, и если он опущен, для подпрограммы не задается @_ array: вместо этого подпрограмме виден @_ array во время вызова. Это эффективный механизм, которого новые пользователи, возможно, пожелают избежать.
Вам не нужны пустые скобки после вашего объявления sub. Они используются для настройки прототипов, чего вам не нужно делать, если вы действительно этого не хотите.
Комментарии:
1. Есть идеи, как я могу передать XML::Writer по ссылке»? Как бы я разыменовал его в подпрограмме?
2. Я не знаком с этим модулем, но я бы сказал, что любой объект передается со скалярным значением.
Ответ №3:
Итак, например: Это оператор using для поиска чего-либо в массиве:
use List::Util qw(first);
Это объявление sub:
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;
}