Forum Webscript.Ru

Программирование => Perl => Тема начата: micolo от 18 Апреля 2007, 13:50:15

Название: format STDOUT и двумерный массив
Отправлено: micolo от 18 Апреля 2007, 13:50:15
Доброго времени суток!
У меня простой вопрос, но решить самому быстро не получается. Есть скрип который обрабатывает логи по нужному формату.


push @a, [split /\\|/] while <>;

for(my $y=0; $y<@a; $y++) {

    for(my $x=0; $x<@{$a[$y]}; $x++) {

format STDOUT=
@<<<<<<<<<<<<<<<<<<<<    @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<
$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x]
.
write();

    }

}

 
Мне нужно чтобы запись из массива записывалась в строчку. Я у меня получается в столбик - где моя ошибка?
Название: format STDOUT и двумерный массив
Отправлено: unplugged от 18 Апреля 2007, 15:51:34
Во-первых, очень сомневаюсь, что вот эта конструкция может корректно работать:
push @a, [split /|/] while <>;
| - специальный символ в перловых регекспах, надо ескейпить, и лучше бы результат split сохранять в отдельном массиве. Получится подлиннее, но зато работает:

#!/usr/bin/perl
use Data::Dumper;
while ( my $str = <> ) {
        chomp $str;
        my @split = split /\\|/, $str;
        push @a, \\@split;
}

#push @a, [split /\\|/] while <> ne "quit\\n";
#print Dumper( @a );

for(my $y=0; $y<@a; $y++) {

    for(my $x=0; $x<@{$a[$y]}; $x++) {

format STDOUT=
@<<<<<<<<<<<<<<<<<<<<    @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<     @<<<<<<<<<<<<<<<<<<<<
$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x],$a[$y]->[$x]
.
write;

    }

}


Остальное не трогал - зачем вообще выводить по восемь одинаковых слов в строке :)?
Название: format STDOUT и двумерный массив
Отправлено: micolo от 18 Апреля 2007, 18:18:41
да нашёл такой пример в инете, вообще мне нужно чтобы в строке были разные значения....
Название: format STDOUT и двумерный массив
Отправлено: unplugged от 18 Апреля 2007, 18:44:39
Впервые вижу пример использования format-write в перле :)
По-моему, для форматирования текста вполне достаточно (s)printf:

#!/usr/bin/perl
use strict;

my @a;
while ( my $str = <> ) {
        chomp $str;
        last if lc($str) eq "quit";
        my @split = split /\\\\|/, $str;
        push @a, \\\\@split;
}

for(my $y=0; $y<@a; $y++) {
    for(my $x=0; $x<@{$a[$y]}; $x++) {
        printf "%10s", $a[$y]->[$x];
    }
    print "\\n";
}

P.S. Движок почему-то тупо вырезает обратные слеши внутри тегов PHP. Должно быть:
my @split = split /\\|/, $str;
push @a, \\@split;
Название: format STDOUT и двумерный массив
Отправлено: vladsu от 19 Апреля 2007, 18:06:05
micolo
Покажите пожалуйста входящую строку, и вид как бы Вы хотели эту строку отформатировать.

Цитировать
Впервые вижу пример использования format-write в перле
По-моему, для форматирования текста вполне достаточно (s)printf:

Формат используется для построения аскии-отчетов, видимо их Вам просто не приходилось делать, т.к.  для контроля элайтмента Вам придется написать минимум 3 функции, а есть еще футеры, хедеры, номера страниц... Все это реализуемо, но когда реализуете, поймете, что это давно есть и Вы изобрели велосипед.