2011-02-03 1 views
1

、私は以下のように定義された形式になります。書き込み中にperlで動的フォーマットを実行するには?

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

だから、質問は以下の通りです:

  1. は、動的な印刷値のリストを作成することが可能ですか?例: リスト1に12の要素が含まれていて、$ flag1が定義されている場合は、すべての要素の代わりに0..10の要素のみを出力します。$ flagをパラメータを生成するサブ要素に渡してこの処理を試みました。しかし、最後に定義されたFORMATが常に優先されるように見え、最終的な書き込みが発生した場合は、条件が何であっても最後のフォーマットが適用されます。
  2. 同じプロセスを使用してフィールドを追加/非表示することもできますか。例えば$ flag2が定義されている場合は、追加フィールドField4をリストに追加しますか?

答えて

0

のフォーマットへのアクセス、基本的に内部で男perlformををハッキングすることで、私は、フォーマット機能は、動的なアプローチのために非常に適しているとは思わない - あなたはsprintfpackテンプレートを使用しようとすることができます。それらのフォーマットは、オンザフライで構築するのが簡単な単純な文字列です。

+0

私はこの時点で、私は先に進んでこのショットを与えると思います。ありがとう。 – Bee

0

私には、一度に多くのことをしているようです。

出力をフォーマットする前に、フラグのチェックを作成してから、 フラグ(たとえば、配列の最初の10要素)に基づいてスカラーを作成します。 次に、文字列を出力に配置します。

フラグ2が設定されている場合は、Field4のWHOLEテーブル+エントリである というスカラーを作成することもできます。ifステートメントでスカラーを出力に連結します。

"巧妙な"しようとするよりも、いくつかのコード行ですべての手順を実行するよりも、正しく仕事を行うために多くの手順を実行することをお勧めします。

+0

ありがとうございます、私は、表示する要素を決定するために外側をチェックするフラグを行うことができたと思います。しかし、2番目のものについては、申し訳ありませんが、私は出力を連結するあなたのコメントを理解していませんでした。あなたはpl?精巧? – Bee

0

の内部

  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

それはperlformから直接OKです、あなたはそれが何かを説明することができるでしょうか。私はまだperlにはかなり新しいです。 – Bee

+0

ここでは、アキュムレータ変数( '$^A')をクリアし、フォーマットされたデータ(' formline'呼び出し)を埋め込み、アキュムレータの新しい内容を返す 'swrite'という名前のサブクラスを定義します。 HEREDOCが使用されているため、使用方法はちょっと暗いです。最初のパラメータ( 'END'まで)として' swrite'呼び出しの下に数行しかかからず、その他のパラメータは1,2,3です。 – bvr

+0

ありがとうございます、この時点で把握するには複雑すぎる。私が時間を見つけたときにこれをもう一度見てみましょう。 – Bee

関連する問題