如何从存储在文件中的表中获取特定索引
Posted
技术标签:
【中文标题】如何从存储在文件中的表中获取特定索引【英文标题】:How to get the particular index from the table stored in a file 【发布时间】:2011-12-12 08:44:32 【问题描述】:我正在以表格形式从文件中获取输出。
这就是 file.txt 的样子。假设它是一个 4*4 矩阵
1 2 3 4
a b c d
e f g h
i j k l
现在我想获取表格的特定元素,比如第二行和第三列。我正在使用下面的代码,但我没有得到输出。
我将表格存储在一个数组中并获取它的引用。
open(FH, "file.txt);
@Table = <FH>;
close FH;
$ref = \@Table;
print "$$ref[2][3]";
输出应该是“c”
请告诉我为什么没有输出
【问题讨论】:
能否提供示例输入和所需的输出以及更多代码?如果您更清楚您到底想做什么,人们可能会为您提供帮助。 嘿,我修改了代码。 【参考方案1】:这里有一段代码,可以按你的意愿工作:
# 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
【讨论】:
谢谢。你能用这个也打印 $$ref[1][2]; @Nitesh:不,你不能。就像我在回答中提到的那样,您可以使用print @$ref[2]->[3]
,但我不知道您为什么要这样做。【参考方案2】:
你要写的是什么
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
前几天我在 SO 的另一个答案中看到了这个 Perl references quick-reference。你会受益于看看它。并且永远不要在没有use strict;use warnings;
的情况下编写 Perl 代码。这是自找麻烦。
【讨论】:
我想获取第二行第三列。假设 $i = 2 和 $j = 3。 是的 $ref->[2][3] 和 $$ref[2][3] 是一样的。但我没有得到输出。我的疑问是我想获得表格的特定元素(比如第 2 行和第 3 列)。怎么做 @Nitesh:那么你必须使用$ref->[1][2]
,因为 Perl 使用从零开始的索引。不,它们不一样。
我认为下面的代码将逐行读取,然后将每一行存储在一个数组中,然后制作一个数组,如@Table = qw/\@array1 \@array2 \@array3 \@array4 /;然后是我提到的所有相同的代码
$ref->[2][3] 和 $$ref[2][3] 有什么区别【参考方案3】:
不,它不应该是'c'。如果您想要 3rd 行(索引:0、1、2)和 4th 列(索引:0、1、2、3),则不是。
Perl 是一种零索引语言,与 C 和 Java 以及任何其他语言类似。如果您希望$table->[2][3]
为“c”,则需要以某种方式分配它。
此外,简单地制作一个行数组不会起作用。 @Table = <FH>;
只是创建一个包含四行的一维数组。您需要至少这样做:
@Table = map [ split ' ' ] <FH>;
但是,这仍然无法解决索引问题。但这会:
@Table = ( undef, map [ undef, split ' ' ] <FH> );
我不推荐设置$[
!!
【讨论】:
以上是关于如何从存储在文件中的表中获取特定索引的主要内容,如果未能解决你的问题,请参考以下文章
如何从加载在 sql/plsql 表中的 csv 文件中获取值