Поместите use warnings; use strict;
в начало каждой написанной вами программы.Эти две прагмы поймают за вас много ошибок.
Вы не можете получить доступ к массиву с постфиксом (...)
.Эта конструкция используется для вызова функций mysub(...)
или $mysubref->(...)
.Для доступа к элементам массива вы используете постфикс [ index ]
.А в Perl для многомерных массивов требуется пара [...]
для каждого уровня.Это связано с тем, что 2D-массив - это просто массив, в котором каждый элемент также является массивом.
my @array = ([1, 2, 3], [4, 5, 6], [7, 8, 9]);
my $top_left = $array[0][0]; # 1
my $bottom_right = $array[2][2]; # 9
print "@$_\n" for @array;
1 2 3
4 5 6
7 8 9
Подробнее о структурах данных Perl и остальной части Perl можно узнать по адресу perldoc.perl.org .Вот несколько прямых ссылок:
Наконец, @language.length
не делает то, что вы думаете, что он делает.Он принимает @language
в скалярном контексте, то есть его длину как число, а затем объединяет его с length($_)
.Полученное выражение выглядит как (scalar @language) . length($_)
.Поскольку оператор <=
налагает скалярный контекст на его аргументы, вы можете просто написать $id <= @language
.Тем не менее, Perl предоставляет вам более естественный способ написания цикла такого типа:
for my $id (0 .. @language) {...}
или
for my $id (0 .. $#language) {...}
, если вы действительно имели в виду
$id < @language
, поскольку
$language[scalar @language]
- это один элементза концом массива.