0

表形式のファイルから出力を取得しています。

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」である必要があります

出力が来ない理由を教えてください

4

3 に答える 3

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
于 2011-12-12T09:14:32.940 に答える
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。角かっこ(および)の代わりにparens((および))を使用して内部配列を囲むことも可能です。これは、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リファレンスのクイックリファレンスが投稿されているのを見ました。あなたはそれを見ることから利益を得るでしょう。また、。なしでPerlコードを記述しないでuse strict;use warnings;ください。それはトラブルを求めています。

于 2011-12-12T08:54:16.953 に答える
1

いいえ、「c」であってはなりません。3行目(インデックス:0、1、2)と4列目(インデックス:0、1、2、3)が必要な場合は除きます。

Perlは、CやJava、その他の多くの言語と同様に、ゼロインデックス言語です。'c'になりたい場合$table->[2][3]は、特定の方法で割り当てる必要があります。

また、単に線の配列を作成するだけでは機能しません@Table = <FH>;4本の線が入った1次元配列を作成するだけです。少なくともこれを行う必要があります:

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

ただし、それでもインデックスの問題は修正されません。しかし、これは次のようになります。

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

設定はお勧めしません$[!!

于 2011-12-12T13:18:37.603 に答える