2013-06-28 4 views
0

У меня есть файл, который выглядит следующим образом:как получить доступ к многомерный массив в Perl

A:B:C 
G:P:T 
K:M:Q 
... 

Я загрузил файл в массив @letters.

Мне нужно получить каждую букву без : и передать ее как параметр другому сценарию, который я вызываю.

так

/bin/kish -x /home/whatever/testscript $letter[0 1] $letter[0 2] $letter[0 3] 

затем

/bin/kish -x /home/whatever/testscript $letter[1 1] $letter[1 2] $letter[1 3] 

до конца массива.

Любые предложения?

+0

попробовал 'split (": ")'? [perldoc] (http://perldoc.perl.org/functions/split.html) –

+0

Не обманывайте себя, думая, что первый аргумент 'split' - это строка. Используйте 'split /: /' – ikegami

ответ

0
while ($line=<FILEHANDLE>) { 
    @letters=split(/\W+/,$line); 
    system("/bin/kish -x /home/whatever/testscript $letters[0] $letters[1] $letters[2]"); 
} 

Сначала вам необходимо открыть FILEHANDLE. Цикл while() (первый) считывает файл по одной строке за раз. Второй берет линию, разбивает ее на куски (для определения разрывов между кусками используются не буквенно-цифровые символы [такие как «:»]. Системная строка выполняет команду. Последняя строка "}" показывает, где заканчивается цикл.

1

Итак, сначала нам нужно создать многомерный массив, лучший способ я знаю, чтобы сделать это в Perl использует ссылки:

use strict; 
use warnings; 

open(my $fh, "<", "data"); 
my @rows; 
while (my $line = <$fh>) { 
    chomp $line; 
    my @row = split(':', $line) ; 
    push(@rows, \@row); 
}; 

\ оператор в \@row означает, что каждый элемент списка @rows на самом деле ссылка на другой список @row. Это позволяет сортировать вложенной индексации, которые вы, кажется, ищет, как так:

`/bin/kish -x /home/whatever/testscript $rows[0]->[0] $rows[0]->[1] $rows[0]->[2]` 

Первый индекс мы в список, как обычно (это «строка» номер). Оператор стрелки -> разыскивает ссылку на список, затем индексируем в этот разыменованный список с соответствующим номером столбца

+0

Загрузка массива сработала, спасибо! Я могу распечатать каждый элемент, используя: – user1718586

+0

Загрузка массива сработала, спасибо! Я могу печатать каждый элемент, используя: foreach my $ index (0 .. $ # rows) {print "$ rows [$ index] -> [0] \ n"; print "$ rows [$ index] -> [1] \ n"; print "$ rows [$ index] -> [2] \ n"; но когда я заменил отпечатки на exec ("/ bin/ksh -x/home/blah/test1 $ rows [$ index] -> [0] $ rows [$ index] -> [1] $ rows [$ index] -> [2] "); } он выполняет только скрипт для первого элемента, а не другого. Есть идеи. благодаря! – user1718586

+0

вы должны использовать 'system', а не' exec' – qwwqwwq