Как получить определенный индекс из таблицы, хранящейся в файле - PullRequest
0 голосов
/ 12 декабря 2011

Я беру вывод из файла в табличной форме.

Вот так будет выглядеть файл 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 ]

2 голосов
/ 12 декабря 2011

Вот код, который работает так, как вы хотите:

# 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
2 голосов
/ 12 декабря 2011

Что вы хотите написать, это

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;.Это напрашивается на неприятности.

1 голос
/ 12 декабря 2011

Нет, это не должно быть 'c'.Нет, если вам нужен столбец 3rd (индексы: 0, 1, 2) и столбец 4th (индексы: 0, 1, 2, 3).

Perl - это язык с нулевым индексом, такой как C и Java и любое количество других языков .Если вы хотите, чтобы $table->[2][3] было 'c', вам нужно назначить его определенным образом.

Кроме того, простое создание массива строк не сработает.@Table = <FH>; просто создает одномерный массив с четырьмя линиями в нем.Вам нужно будет сделать как минимум this:

@Table = map { [ split ' ' ] } <FH>;

Однако это не решит проблему с индексом.Но это будет:

@Table = ( undef, map { [ undef, split ' ' ] } <FH> );

Я не рекомендую установить $[ !!

...