LINUX.ORG.RU

perl script


0

0

Hi All .

помогите со скриптом на perl
есть файл с 6 строчками . надо прочитать и на выходе получить 6 массивов ,

с 1 строчкой в каждом массиве .


пока я придумал такой вот изврашенный вариант
my $x = 0;
foreach my $line (@mass) {
$line =~ s/^.*\{(.*)\}$/$1/g;
my @row = split('\s+',$line);
push (@{'mas'.$x},@row);
$x++;
}

на выходе получаю 6 @mas0 -@mas5

минус такого варианта что при use strict оно не работает .

$./readmnt3.pl
Can't use string ("mas0") as an ARRAY ref while "strict refs" in use at

./readmnt3.pl line 46.

anonymous

strict refs запрещает использование символьных ссылок. не проще ли использовать один двумерный массив вместо 6 одномерных?

friday ★★★
()

Ну так убери strict, к примеру так: no strict 'refs';
Или:

use strict;
===========
кусок кода
===========
no strict;
===========
твой код
===========
use strict
===========
опять код

А зачем тебе 6 одномерных массивов?
Странно как то. Массив он же подразумевает
некоторое кол-во объектов, у тебя же в каждом
по одной строке которые могут спокойно себе
жить в одномерном массиве.

anonymous
()
Ответ на: комментарий от anonymous

> у тебя же в каждом по одной строке которые могут спокойно себе жить в одномерном массиве

> не проще ли использовать один двумерный массив вместо 6 одномерных

на сях уже думаю:-)) конечно одномерный

friday ★★★
()
Ответ на: комментарий от friday

ok спасибо , особенно respect за no strict .
будем думать дальше .
нужны именно 6 массивов , так как дальше весь код на этом завязан , да и легче так , чем с матрицей.

anonymous
()
Ответ на: комментарий от anonymous

поступил тупо 
обьявил hash %mass = ();
foreach my $line (@mass) {
        $line =~ s/^.*\{(.*)\}$/$1/g;
        $mass{$x} = $line;
        $x++;
}
my @mas1 = split('\s+',$mass{1}) ;
my @mas2 = split('\s+',$mass{2}) ;
my @mas3 = split('\s+',$mass{3}) ;
my @mas4 = split('\s+',$mass{4}) ;
my @mas5 = split('\s+',$mass{5}) ;
my @mas6 = split('\s+',$mass{6}) ;

последние 6 строчек напрягают 

хочется что-то типа 

for ($x = 1 ; $x <=6; $x++) {
	 @mas$x = split('\s+',$mass{$x});
} 
ессно @mas$x =не работает .
нельзя такое осушествить не прибегая к указателям ?

anonymous
()
Ответ на: комментарий от anonymous

Цель непонятна - не проще в остальном коде заменить @mas6 на @{$array[6]}? Или, если уж на то пошло, что вы имеете против указателей?

Вообще, нумерованные переменные - верный признак того, что вы что-то делаете неправильно.

[flame on] Вот после такого кода люди говорят, что Perl - нечитабельный уродский язык... [flame off]

anonymous
()
Ответ на: комментарий от anonymous

#!/use/bin/perl -w

@mass=('a b c','d e f','g h j','i k l','e e q','a s d f g');
$x=1;
foreach my $line ( @mass ) {
  $line=~s/^.*\{(.*)\}$/$1/g;
  @{$mass{$x++}} = @{[split /\s/ => $line]};
}

foreach my $k (sort keys %mass){
  print "[ $k ]", join " ! " => @{$mass{$k}},"\n";

}

p.s. хэшем массивов это зовется.

vilfred ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.