Perl - функция с двумя аргументами массива - PullRequest
0 голосов
/ 27 февраля 2019

У меня проблемы с использованием функции в Perl.

У моей функции есть 2 аргумента, которые являются массивами:

sub get_coordinate {
    my (@array_col, @array_lin) = (@_);

    do some stuff
}

Я называю это так:

    $index_col                  = int(rand(10));
    $index_lin                  = int(rand(10));
    @array_col                  = (0,0,0,0,0,0,0,0,0,0);
    @array_lin                  = (0,0,0,0,0,0,0,0,0,0);
    $array_col[$index_col]      = 1;
    $array_lin[$index_lin]      = 1;

    get_coordinate(@array_col, @array_lin);

Моя проблема в том, что я получаю сообщение об ошибке: Использование неинициализированного значения в @array_lin в числовом выражении (==) в строке switch.pl 82 (# 1) (W неинициализированный) Неопределенное значение использовалось, как если бы оно уже было определено,Это интерпретировалось как "" или 0, но, возможно, это было ошибкой.Чтобы подавить это предупреждение, назначьте определенное значение вашим переменным.

Я не понимаю, почему @array_col инициализируется, а не @ array_lin.

Когда я печатаю @array_col и @array_lin внутри функциитаким образом:

print "@array_col\n@array_lin\n";

Я получаю: 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0

Есть идеи?

Thx, SLP

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

В Perl все списки плоские.Эти два списка эквивалентны.

( 1, 2, ( 3, 4, ( 5 ), (6, 7), 8), (), )
( 1, 2, 3, 4, 5, 6, 7, 8 )

То же самое происходит и тогда, когда вы берете несколько массивов и помещаете их в список.

my @foo = (1, 2, 3);
my @bar = (4, 5, 6);
my @new = (@foo, @bar); # 1, 2, 3, 4, 5, 6

Когда вы передаете вещи в функцию, эти вещипревратиться в список аргументов.Следовательно, оба массива окажутся в одном списке, как @foo и @bar выше.

frobnicate(@foo, @bar);

Когда вы назначаете что-либо в контексте списка, весь список будет назначен слева направо.Для скаляров в списке слева это означает, что они получат свои значения.Но как только появится массив, он будет жадным.Он поглотит все оставшиеся значения.

my ($one, $two, @rest, $will_be_undef) = (1, 2, 3, 4, 5, 6);

Значения будут присвоены так:

$one = 1;
$two = 2;
@rest = ( 3, 4, 5, 6 );
$will_be_undef = undef;

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

frobnicate( \@foo, \@bar );

sub frobnicate {
    my ($first_array, $second_array) = @_;

    my @foo = @{ $first_array };
    my @bar = @{ $second_array };

    ...
}
0 голосов
/ 27 февраля 2019

Присвоение нескольким массивам (или хэшам) не соответствует вашим ожиданиям:

my (@array1, @array2) = ...

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

Вместо него можно использовать ссылки на массивы:

sub get_coordinate {
    my ($arr1, $arr2) = @_;
    my @arr1 = @$arr1;
    my @arr2 = @$arr2;
    ...
}
get_coordinate(\@array1, \@array2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...