Как выполнить динамическое форматирование с помощью Perl во время записи? - PullRequest
1 голос
/ 03 февраля 2011

У меня есть формат, который определен, как показано ниже:

format STDOUT =
------------------------------------
|Field1      | Field2     | Field3 |
------------------------------------
|@<<<<<<<<<<| @<<<<<<<<<<<| @<<<<< |~~
shift(@list1),shift(@list2),shift(@list3)
------------------------------------
.
write STDOUT;

Итак, вопросы такие, как показано ниже:

  1. Возможно ли сделать список значений напечатанным динамическим?Например, если список 1 содержит 12 элементов, и если определен $ flag1, то выведите только элементы 0..10 вместо всех 12. Я попытался сделать это, передав $ flag в качестве параметра для подпрограммы, которая генерирует отчет.Тем не менее, последний определенный FORMAT, кажется, всегда имеет приоритет, и окончательная запись, когда это происходит, применяет последний формат независимо от того, каково условие.
  2. Можно ли также добавить / скрыть поля, используя тот же процесс.Например, если определено $ flag2, добавить дополнительное поле Field4 в список?

Ответы [ 3 ]

0 голосов
/ 03 февраля 2011

По сути, взломав внутренние органы, man perlform Доступ к форматированию Внутренние органы

          use Carp;
           sub swrite {
               croak "usage: swrite PICTURE ARGS" unless @_;
               my $format = shift;
               $^A = "";
               formline($format,@_);
               return $^A;
           }

           $string = swrite(<<'END', 1, 2, 3);
        Check me out
        @<<<  @|||  @>>>
        END
           print $string;
0 голосов
/ 03 февраля 2011

Я не думаю, что функция форматирования очень подходит для динамического подхода - вы можете попробовать использовать шаблоны sprintf или pack. Их форматы - это простые строки, которые легче создавать на лету.

0 голосов
/ 03 февраля 2011

Мне кажется, что вы делаете много одновременно.

Прежде чем форматировать вывод, создайте проверку для флага, затем создайте скаляр на основе флага (например, первые 10 элементовмассив).Затем поместите строку в вывод.

Вы также можете создать скаляр, который является таблицей WHOLE + запись в Field4, а затем, если установлен флаг два, в операторе if объедините скаляр с выходными данными.1005 *

Лучше сделать много шагов, чтобы правильно выполнить работу, чем пытаться быть «умным» и выполнять все шаги в несколько строк кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...