Perl 如何从存储在文件中的表中获取特定索引
我以表格形式从文件中获取输出 这就是file.txt的外观。假设它是一个4*4矩阵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”
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使用基于零的索引。不,它们不一样。我认为下面的代码将逐行读取,然后将每一行存储在一个数组中,然后在