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

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]-&gt;[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-&gt;[2]-&gt;[3],也可以写成$ref-&gt;[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-&gt;[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-&gt;[2][3] 为“c”,则需要以某种方式分配它。

此外,简单地制作一个行数组不会起作用。 @Table = &lt;FH&gt;; 只是创建一个包含四行的一维数组。您需要至少这样做:

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

但是,这仍然无法解决索引问题。但这会:

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

推荐设置$[!!

【讨论】:

以上是关于如何从存储在文件中的表中获取特定索引的主要内容,如果未能解决你的问题,请参考以下文章

如何从数据库中的表中打印该特定选项的所有数据?

如何从存储过程的表中的列中获取输出参数

如何从加载在 sql/plsql 表中的 csv 文件中获取值

如何从 SQL Server 中特定数据库的表中获取所有列名?

从具有特定值的表中获取列名

单击仅使用 JavaScript 从 JSON 获取的表数据中的按钮时引用特定行