#arrays #perl #multidimensional-array #reference
#массивы #perl #многомерный-массив #ссылка
Вопрос:
Когда я хочу присвоить входной файл массиву, я получаю эту ошибку.
while (<>) {
my @tmp = split;
push my @arr,[@tmp];
print "@arrn";
}
output: ARRAY(0x7f0b00)
ARRAY(0x7fb2f0)
Если я изменю [
на (
then, я получу требуемый результат.
while (<>) {
my @tmp = split;
push my @arr,(@tmp);
print "@arrn";
output: hello, testing the perl
check the arrays.
В чем разница между и ? (@tmp)
[@tmp]
Ответ №1:
Обычные круглые скобки ()
не имеют специальной функции, кроме изменения приоритета. Они обычно используются для ограничения списка, например my @arr = (1,2,3)
, квадратные скобки возвращают ссылку на массив. В вашем случае вы бы строили двумерный массив. (Вы бы сделали, если бы ваш код не был нарушен).
Возможно, ваш код должен быть написан следующим образом. Обратите внимание, что вам нужно объявить массив вне блока цикла, иначе он не будет сохранять значения из предыдущих итераций. Также обратите внимание, что вам не нужно использовать @tmp
массив, вы можете просто поместить split
его внутрь push
.
my @arr; # declare @arr outside the loop block
while (<>) {
push @arr, [ split ]; # stores array reference in @arr
}
for my $aref (@arr) {
print "@$aref"; # print your values
}
Этот массив будет иметь структуру:
$arr[0] = [ "hello,", "testing", "the", "perl" ];
$arr[1] = [ "check", "the", "arrays." ];
Это хорошая идея, если вы, например, хотите избежать путаницы строк ввода. В противном случае все значения попадают на один и тот же уровень массива.