1

次の問題があります。

次のようなファイルがあります。

1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7

次のようなさまざまなベクトルを作成したい:

vector[0][0]=1 , vector[0][1]=2, ... , vector[1][0]=3, vector[1][1]=1 etc etc

私はまだ始めたばかりで、次のことを試しました。

my $file = 'file.dat';
open (INFO, $file);
my @vector = <INFO>;
close (INFO);

しかし、それはファイルに含まれているものを読み取る配列を作成するだけで、ファイルの要素の正確な位置を(私が期待している結果として)与えません。

4

2 に答える 2

4

ファイルを反復処理し、行を分割して、メイン配列にプッシュする無名配列内に配置します。

use strict;
use warnings;
use Data::Dumper;

# Use the lines below for your real data
#my $file = 'file.dat';
#open my $fh, "<", $file or die "Cannot open $file: $!";
my @vector;
while (<DATA>) {   # replace <DATA> with <$fh>
    push @vector, [ split ];
}
print Dumper \@vector;

__DATA__
1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7

出力:

$VAR1 = [
          [
            '1',
            '2',
            '4',
            '5',
            '7',
            '8'
          ],
          [
            '3',
            '1',
            '3',
            '7',
            '8',
            '9',
            '10',
            '11'
          ],
          [
            '2',
            '4',
            '1',
            '3',
            '5'
          ],
          [
            '4',
            '5',
            '6',
            '7'
          ]
        ];
于 2013-03-02T16:43:54.220 に答える
2

mapと正規表現を使用して数値の部分文字列を選択するだけで、これを行うことができます。my @vector = map [ /\d+/g ], <FILEHANDLE>

DATAこのプログラムは、デモンストレーションを容易にするためにファイルハンドルから読み取ります。通常は、自分でファイルを開き、open my $fh, '<', 'myfile' or die $!そのファイルハンドルから読み取ります。

Data::Dumpデータ構造を表示するためだけにあり、それ以外の場合は不要です。

use strict;
use warnings;
use 5.010;

my @vector = map [ /\d+/g ], <DATA>;

use Data::Dump;
dd \@vector;

say "\$vector[0][0] = $vector[0][0]";
say "\$vector[0][1] = $vector[0][1]";
say "\$vector[1][0] = $vector[1][0]";
say "\$vector[1][1] = $vector[1][1]";


__DATA__
1 2 4 5 7 8
3 1 3 7 8 9 10 11
2 4 1 3 5
4 5 6 7

出力

[
  [1, 2, 4, 5, 7, 8],
  [3, 1, 3, 7 .. 11],
  [2, 4, 1, 3, 5],
  [4 .. 7],
]
$vector[0][0] = 1
$vector[0][1] = 2
$vector[1][0] = 3
$vector[1][1] = 1
于 2013-03-02T19:54:10.237 に答える