Как получить определенный индекс из таблицы, хранящейся в файле
Я беру вывод из файла в табличной форме.
Вот так будет выглядеть файл file.txt. предположим, что это матрица 4*4
1 2 3 4
a b c d
e f g h
i j k l
Теперь я хочу получить определенный элемент таблицы, скажем, 2-й ряд и 3-й столбец. Я использую код ниже, но я не получаю вывод.
Я храню таблицу в массиве и принимаю ссылку на нее.
open(FH, "file.txt);
@Table = <FH>;
close FH;
$ref = \@Table;
print "${$ref[2][3]}";
Выход должен быть "C"
Пожалуйста, скажите мне, почему выход не приходит
3 ответа
Вот код, который работает так, как вы хотите:
# ALWAYS use these 2 lines at the begining of your programs
use strict;
use warnings;
my $file = 'file.txt';
# use lexical file handler, 3 arg open and test if open is OK
open my $fh, '<', $file or die "unable to open '$file' for reading:$!";
my @Table;
while(<$fh>) {
push @Table,[split];
}
close $fh;
my $ref = \@Table;
# this prints the third element of the second line
# array index start at 0
print $ref->[1][2];
выход:
c
Что вы хотите написать
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;
, Откуда я это знаю? Вы бы получили сообщение о том, что Global symbol "@ref" requires explicit package name
если бы вы использовали это. С чем вы пытаетесь получить доступ $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;
, Это напрашивается на неприятности.
Нет, это не должно быть "с". Нет, если вам нужна 3-я строка (индексы: 0, 1, 2) и 4-й столбец (индексы: 0, 1, 2, 3).
Perl - это язык с нулевым индексом, такой как C, Java и любое количество других языков. Если ты хочешь $table->[2][3]
чтобы быть 'c', вы должны назначить его определенным образом.
Кроме того, просто сделать массив строк не будет работать. @Table = <FH>;
просто создает одномерный массив с четырьмя линиями в нем. Вам нужно сделать по крайней мере это:
@Table = map { [ split ' ' ] } <FH>;
Однако это по-прежнему не решит проблему с индексом. Но это будет:
@Table = ( undef, map { [ undef, split ' ' ] } <FH> );
Я не рекомендую установку $[
!!