Программирование > Perl

format STDOUT и двумерный массив

(1/1)

micolo:
Доброго времени суток!
У меня простой вопрос, но решить самому быстро не получается. Есть скрип который обрабатывает логи по нужному формату.


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();

    }

}


Мне нужно чтобы запись из массива записывалась в строчку. Я у меня получается в столбик - где моя ошибка?

unplugged:
Во-первых, очень сомневаюсь, что вот эта конструкция может корректно работать:
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;

    }

}


Остальное не трогал - зачем вообще выводить по восемь одинаковых слов в строке :)?

micolo:
да нашёл такой пример в инете, вообще мне нужно чтобы в строке были разные значения....

unplugged:
Впервые вижу пример использования 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;

vladsu:
micolo
Покажите пожалуйста входящую строку, и вид как бы Вы хотели эту строку отформатировать.


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

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

Навигация

[0] Главная страница сообщений

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 
Перейти к полной версии