2013-03-02 3 views
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

перебирать файл, разделить строки и поместить их в анонимный массив, который вы толкнуть на ваш основной массив:

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' 
      ] 
     ]; 
+0

Извините, но как я могу открыть файл данных? Если файл называется 'file.dat', как я могу сказать в сценарии, чтобы пойти и найти данные в этом файле? –

+0

Вы уже открыли файл в своем коде. Вы не знали об этом? Потому что это было похоже на тебя. Хотя вы должны использовать три аргумента open и лексический дескриптор файла. А также проверьте возвращаемое значение вашего открытого оператора. – TLP

+0

Спасибо, много, работает –

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 
Смежные вопросы