Perl 如何从存储在文件中的表中获取特定索引

Perl 如何从存储在文件中的表中获取特定索引,perl,perl-data-structures,line-processing,Perl,Perl Data Structures,Line Processing,我以表格形式从文件中获取输出 这就是file.txt的外观。假设它是一个4*4矩阵 1 2 3 4 a b c d e f g h i j k l 现在我想获取表中的一个特定元素,比如第二行和第三列。我正在使用下面的代码,但没有得到输出 我将表存储在一个数组中并获取它的ref open(FH, "file.txt); @Table = <FH>; close FH; $ref = \@Table; print "${$ref[2][3]}"; open(FH,“file.txt”

我以表格形式从文件中获取输出

这就是file.txt的外观。假设它是一个4*4矩阵

1 2 3 4
a b c d
e f g h
i j k l
现在我想获取表中的一个特定元素,比如第二行和第三列。我正在使用下面的代码,但没有得到输出

我将表存储在一个数组中并获取它的ref

open(FH, "file.txt);
@Table = <FH>;
close FH;
$ref = \@Table;
print "${$ref[2][3]}";
open(FH,“file.txt”);
@表=;
关闭FH;
$ref=\@表;
打印“${$ref[2][3]}”;
输出应为“c”


请告诉我为什么输出不来

你想写的是

print "$ref->[2][3]";

根据您的描述,我假设您声明了类似以下内容的
@Table

my @Table = ([1, 2, 3, 4], 
     ['a', 'b', 'c', 'd'], 
     ['e', 'f', 'g', 'h'],
     ['i', 'j' 'k' 'l']);
也就是说,我很确定你没有使用
use strict;
,所以你没有使用
my
。我怎么知道?如果你使用了
Global symbol“@ref”,你会收到一条消息说
Global symbol“@ref”需要显式的包名
。你试图使用
$ref[2]访问的内容
是数组
@ref
中的一个元素;而不是数组ref
$ref
中的一个元素。也有可能使用paren(
)而不是括号(
[
]
)来封装内部数组,这是一个问题,因为这会导致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抱怨
不能使用字符串(“h”)作为标量引用

编辑:由于问题在我回答后发生了很大变化,这里有一个适用的解决方案:

#!/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
!/usr/bin/perl
严格使用;
使用警告;
我的$ref=[];

打开(我的$fh,“你想写的是

print "$ref->[2][3]";

根据您的描述,我假设您声明了类似以下内容的
@Table

my @Table = ([1, 2, 3, 4], 
     ['a', 'b', 'c', 'd'], 
     ['e', 'f', 'g', 'h'],
     ['i', 'j' 'k' 'l']);
也就是说,我很确定你没有使用
use strict;
,所以你没有使用
my
。我怎么知道?如果你使用了
Global symbol“@ref”,你会收到一条消息说
Global symbol“@ref”需要显式的包名
。你试图使用
$ref[2]访问的内容
是数组
@ref
中的一个元素;而不是数组ref
$ref
中的一个元素。也有可能使用paren(
)而不是括号(
[
]
)来封装内部数组,这是一个问题,因为这会导致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抱怨
不能使用字符串(“h”)作为标量引用

编辑:由于问题在我回答后发生了很大变化,这里有一个适用的解决方案:

#!/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
!/usr/bin/perl
严格使用;
使用警告;
我的$ref=[];

打开(my$fh),这里有一个代码,可以根据您的需要工作:

# 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];

下面是一段代码,可根据需要工作:

# 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”。如果您想要第三行(索引:0、1、2)和第四列(索引:0、1、2、3),则不应该是

Perl是一种零索引语言,与C、Java和其他任何语言一样。如果希望
$table->[2][3]
为“C”,则需要以某种方式分配它

另外,简单地创建一个行数组是行不通的。
@Table=;
只创建一个包含四行的一维数组。您至少需要这样做:

@Table=map{[split']};
但是,这仍然无法解决索引问题。但这将:

@Table = ( undef, map { [ undef, split ' ' ] } <FH> );
@Table=(未定义,映射{[unde,split']});
我不建议设置!!

不,它不应该是“c”。如果您想要第三行(索引:0、1、2)和第四列(索引:0、1、2、3),则不建议设置

Perl是一种零索引语言,与C、Java和其他任何语言一样。如果希望
$table->[2][3]
为“C”,则需要以某种方式分配它

另外,简单地创建一个行数组是行不通的。
@Table=;
只创建一个包含四行的一维数组。您至少需要这样做:

@Table=map{[split']};
但是,这仍然无法解决索引问题。但这将:

@Table = ( undef, map { [ undef, split ' ' ] } <FH> );
@Table=(未定义,映射{[unde,split']});

我不建议设置!!

请提供示例输入和所需输出以及更多代码,好吗?如果您能更清楚地知道您到底想做什么,人们可能会帮助您。嘿,我修改了代码。请提供示例输入和所需输出以及更多代码,好吗?人们可能会帮助您更清楚的是你到底想做什么。嘿,我修改了代码。我想获取第二行和第三列。比如说$i=2和$j=3。是的$ref->[2][3]和${$ref[2][3]}是一样的。但是我没有得到输出。我怀疑的是我想要获取表的特定元素(比如第二行和第三列).怎么办it@Nitesh:然后您必须使用
$ref->[1][2]
,因为Perl使用基于零的索引。不,它们不一样。我认为下面的代码将逐行读取,然后将每一行存储在一个数组中,然后在