Что вы хотите написать, это
print "$ref->[2][3]";
или
print "@$ref[2]->[3]";
Из вашего описания я предполагаю, что вы объявили @Table
что-то вроде этого:
my @Table = ([1, 2, 3, 4],
['a', 'b', 'c', 'd'],
['e', 'f', 'g', 'h'],
['i', 'j' 'k' 'l']);
То есть я уверен, что вы остановились на my
, так как вы не используете use strict;
.Откуда я это знаю?Вы бы получили сообщение «1013», если бы использовали его.То, к чему вы пытаетесь получить доступ с помощью $ref[2]
, является элементом в массиве @ref
;не элемент в массиве ref $ref
.Также возможно, что вы использовали скобки ((
и )
), чтобы заключить внутренние массивы вместо скобок ([
и ]
), что является проблемой, потому что это заставило бы Perl сгладить массив в
my @Table = (1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' 'k' 'l');
это не то, что вам нужно.
Есть несколько проблем с ${$ref[2][3]}
.Прежде всего, правильный способ доступа к элементам в массиве ref - это $ref->[2]->[3]
, который также можно записать как $ref->[2][3]
(я обычно избегаю этой нотации, так как считаю, что она менее интуитивна).Если бы вам удалось получить этот элемент, вы бы получили ${"h"}
, что является проблемой, потому что Perl жалуется, что Can't use string ("h") as a SCALAR ref
.
РЕДАКТИРОВАТЬ: Поскольку вопрос изменился довольноНемного позже моего ответа вот подходящее решение для записи:
#!/usr/bin/perl
use strict;
use warnings;
my $ref = [];
open (my $fh, "<", "file.txt") or die "Unable to open file $!\n";
push @$ref, [split] for (<$fh>);
close $fh;
print $ref->[1]->[2],"\n"; # print value at second row, third column
Я видел это Краткое руководство по Perl , опубликованное в другом ответе на SO на днях.Вам было бы полезно взглянуть на это.И никогда не пишите код Perl без use strict;use warnings;
.Это напрашивается на неприятности.