これは、Ubuntu Online、Fedora Online、Windows オンライン エミュレーター、または MAC OS オンライン エミュレーターなどの複数の無料オンライン ワークステーションの XNUMX つを使用して、OnWorks 無料ホスティング プロバイダーで実行できるコマンド perlform です。
プログラム:
NAME
perlform - Perl 形式
DESCRIPTION
Perl には、単純なレポートやグラフを生成するためのメカニズムが備わっています。 これを容易にするために、
Perl を使用すると、出力ページを印刷時の外観に近づけてコーディングできます。 それ
ページに何行あるか、現在どのページにいるか、いつ行うかなどを追跡できます。
印刷ページヘッダーなど。キーワードは FORTRAN から借用しています。 フォーマット() 宣言することと
書く() 実行する。 perlfunc のエントリを参照してください。 幸いなことに、レイアウトははるかに優れています
読みやすく、BASIC の PRINT USING ステートメントに似ています。 貧乏人のものだと考えてください ンロフとします。
パッケージやサブルーチンなどの形式は、実行されるのではなく宣言されるため、
プログラム内の任意の時点で発生します。 (通常はすべて一緒にしておくことをお勧めします。)
これらは、Perl の他のすべての「タイプ」とは別に、独自の名前空間を持っています。 この意味は
「Foo」という名前の関数がある場合、それは「Foo」という名前の形式を持つことと同じではありません。
「ふー」。 ただし、特定のファイルハンドルに関連付けられた形式のデフォルト名は、
ファイルハンドル名と同じです。 したがって、STDOUT のデフォルト形式は次のようになります。
「STDOUT」、ファイルハンドル TEMP のデフォルト形式の名前は「TEMP」です。 彼らはただ見ているだけです
同じ。 そうではありません。
出力レコード形式は次のように宣言されます。
形式名 =
フォームリスト
.
名前を省略した場合、フォーマット「STDOUT」が定義されます。 独身者 "。" 列 1 は、次の目的で使用されます
フォーマットを終了します。 FORMLIST は一連の行で構成され、各行は次のいずれかになります。
XNUMX つのタイプ:
1. コメント。最初の列に「#」を入れることで示されます。
2. XNUMX つの出力行の形式を指定する「ピクチャ」行。
3. 前のピクチャ行に接続する値を指定する引数行。
ピクチャ行には、リテラル テキストと混在した出力フィールド定義が含まれます。 これらは
ラインにはいかなる種類の変数補間も行われません。 フィールド定義が作成されました
文字セットからフィールドを開始し、必要な幅までフィールドを拡張します。 これは
フィールド定義の完全な文字セット:
@ 通常フィールドの開始
^ 特殊フィールドの開始
< 左詰め用の埋め込み文字
| センタリング用のパッド文字
> 右揃えのための埋め込み文字
# 右寄せの数値フィールドの埋め込み文字
最初の #: の代わりに 0 を先頭にゼロを付けて番号を埋め込みます
。 数値フィールド内の小数点
...テキストフィールドを終了し、切り捨ての証拠として「...」を表示します
@* 複数行の値の可変幅フィールド
^* 複数行の値の次の行の可変幅フィールド
~ すべてのフィールドが空の行を抑制します
~~ すべてのフィールドがなくなるまで行を繰り返します
画像行の各フィールドは、「@」 (アットマーク) または「^」 (キャレット) で始まり、内容を示します。
それぞれ「通常」フィールドまたは「特別」フィールドと呼びます。 パッド文字の選択
フィールドがテキストであるか数値であるかを決定します。 チルダ演算子は、
分野。 さまざまな可能性を詳しく見てみましょう。
テキスト フィールズ
フィールドの長さは、フィールドを複数の「<」、「>」、または「」で埋め込むことによって指定されます。
"|" 数値以外のフィールドをそれぞれ左揃えで指定する文字、
右揃え、または中央揃え。 通常のフィールドの場合、値 (最初のフィールドまで)
newline) が選択された位置揃えに従って取得および印刷され、余分な部分は切り捨てられます。
文字。 テキストフィールドを「...」で終了すると、次の場合に XNUMX つのドットが表示されます。
値は切り捨てられます。 特別なテキストフィールドを使用して、基本的な複数行テキストを実行できます。
ブロック充填。 詳細については、「塗りつぶしモードの使用」を参照してください。
例:
フォーマット STDOUT =
@<<<<<< @|||||| @>>>>>>
「左」、「中」、「右」
.
出力:
左中右
数値の フィールズ
パディング文字として「#」を使用すると、数値フィールドが右詰めで指定されます。 アン
オプションの「.」 小数点の位置を定義します。 の代わりに「0」(ゼロ)を使用します。
最初の「#」の場合、必要に応じて、書式設定された数値の先頭にゼロが埋め込まれます。 あ
値が未定義の場合、特別な数値フィールドは空白になります。 結果の値が
指定された幅を超える場合、フィールドにはオーバーフローの証拠として「#」が入力されます。
例:
フォーマット STDOUT =
@### @.### @##.### @### @### ^####
42、3.1415、未定義、0、10000、未定義
.
出力:
42 3.142 0.000 0 ####
この フィールド @* for 可変幅 マルチライン テキスト
フィールド「@*」は、複数行の切り捨てられていない値を出力するために使用できます。 そうすべきです(しかし
必要ありません) 行内に単独で出現します。 最後の改行は切り取られますが、他の行はすべて切り取られます。
文字はそのまま出力されます。
この フィールド ^* for 可変幅 一度に XNUMX 行ずつ テキスト
「@*」と同様、これは可変幅フィールドです。 指定する値はスカラー変数である必要があります。
Perl はテキストの最初の行 (最初の "\n" まで) をフィールドに入れてから切り取ります。
文字列の先頭を削除して、次回変数が参照されるときに、より多くの
テキストを印刷することができます。 変数は 復元されます。
例:
$text = "1行目\n2行目\n3行目";
フォーマット STDOUT =
本文: ^*
$ text
~~ ^*
$ text
.
出力:
テキスト: 1行目
ライン2
ライン3
指定 価値観
値は、図と同じ順序で次のフォーマット行に指定されます。
田畑。 値を指定する式はカンマで区切る必要があります。 それらはすべて
行が処理される前にリスト コンテキストで評価されるため、単一のリスト式
複数のリスト要素を生成する可能性があります。 式は複数に広がる場合があります
中括弧で囲まれている場合は行。 その場合、左中括弧は最初のトークンの最初のトークンでなければなりません。
ライン。 式が小数部を含む数値として評価される場合、および
対応するピクチャは、小数部分が出力に表示されるように指定します (つまり、
複数の「#」文字を除く任意の画像です 無し 埋め込み「.」)、文字
「ロケールを使用」の場合、小数点に使用される値は現在の LC_NUMERIC ロケールによって決まります。
が有効になっています。 これは、たとえば、実行時環境がたまたま次のような場合に発生した場合を意味します。
ドイツ語ロケールを指定すると、デフォルトの「.」の代わりに「,」が使用されます。 perllocale および
詳細については、「警告」を参照してください。
使い方 埋める モード
テキスト フィールドでは、キャレットによって一種の塗りつぶしモードが有効になります。 任意の表現ではなく、
指定する値は、テキスト文字列を含むスカラー変数である必要があります。 Perl は、
テキストの次の部分をフィールドに挿入し、文字列の先頭を切り落とします。
次回変数が参照されるときに、より多くのテキストを印刷できるようになります。 (はい、
これは、変数自体が実行中に変更されることを意味します。 書く() 呼び出し、および
は復元されません。) テキストの次の部分は粗い改行によって決まります。
アルゴリズム。 改行文字 (「\r」) を使用して強制的に改行することができます。 あなたはできる
変数 $: を変更することで、改行できる文字を変更します (つまり、
英語モジュールを使用している場合は $FORMAT_LINE_BREAK_CHARACTERS) を必要なリストに追加します。
文字。
通常は、同じフィールドに関連付けられた垂直スタック内の一連のフィールドを使用します。
テキストのブロックを出力するスカラー変数。 最後のフィールドを次で終了することもできます。
テキスト「...」。テキストが長すぎて出力に表示されない場合に出力に表示されます。
全体。
抑制 ラインズ 場所 すべて フィールズ です。 空間
キャレット フィールドを使用すると、すべてのフィールドが空白の行が作成される場合があります。 そういったものを抑えることができます
行の任意の場所に「~」 (チルダ) 文字を入れて行を追加します。 チルダは次のようになります
出力時にスペースに変換されます。
繰り返す フォーマット ラインズ
行のどこかに XNUMX つの連続したチルダ文字「~~」を入れると、その行は次のようになります。
行上のすべてのフィールドが使い果たされるまで、つまり未定義になるまで繰り返されます。 特別用
(キャレット) テキスト フィールドの場合、これは遅かれ早かれ発生しますが、アットマークのテキスト フィールドを使用すると、
さまざまな表現があるため、指定した式に毎回同じ値を永遠に与えないほうがよいでしょう。
(「shift(@f)」は機能する簡単な例です。) 通常の (アット) 数値フィールドは使用しないでください。
そのような行では空白になることはありません。
トップ of フォーム 処理
トップオブフォーム処理は、デフォルトでは、現在のフォーマットと同じ名前のフォーマットによって処理されます。
ファイルハンドルに「_TOP」を連結したもの。 各ページの上部でトリガーされます。 見る
perlfunc で「書く」。
例:
# に関するレポート /etc/passwd file
フォーマット STDOUT_TOP =
パスワードファイル
名前 ログイン Office Uid Gid ホーム
-------------------------------------------------- ----------------
.
フォーマット STDOUT =
@<<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<
$name、$login、$office、$uid、$gid、$home
.
# バグレポートフォームからのレポート
フォーマット STDOUT_TOP =
バグ報告
@<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>>>
$system、$%、$date
-------------------------------------------------- ----------------
.
フォーマット STDOUT =
件名: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<
$subject
インデックス: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<
$index、$description
優先度: @<<<<<<<<<< 日付: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<< <
$priority、$date、$description
送信者: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<
$from、$description
割り当て先: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<
$プログラマー、$説明
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$説明
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$説明
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$説明
~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<
$説明
~ ^<<<<<<<<<<<<<<<<<<<<<<<<...
$説明
.
混ぜることも可能です print()sの 書く()同じ出力チャンネル上にありますが、
"$-" ($FORMAT_LINES_LEFT) を自分で処理する必要があります。
フォーマット Variables
現在のフォーマット名は変数 $~ ($FORMAT_NAME) に保存され、現在のトップ
フォーム形式名は $^ ($FORMAT_TOP_NAME) にあります。 現在の出力ページ番号が保存されます
$% ($FORMAT_PAGE_NUMBER) で、ページの行数は $= です。
($FORMAT_LINES_PER_PAGE)。 このハンドルの出力を自動フラッシュするかどうかは $| に格納されます。
($OUTPUT_AUTOFLUSH)。 ページの各先頭 (最初を除く) の前に出力される文字列は次のとおりです。
$^L ($FORMAT_FORMFEED) に保存されます。 これらの変数はファイルハンドルごとに設定されるため、
あなたはする必要があります 選択する() 別のものに変更して影響を与えます。
select((選択(OUTF),
$~ = "My_Other_Format",
$^ = "My_Top_Format"
)[0]);
かなり醜いですよね? ただし、これは一般的な慣用句なので、これを見てあまり驚かないでください。
少なくとも、一時変数を使用して前のファイルハンドルを保持することができます: (これは非常に面倒です)
可読性が向上するだけでなく、
デバッガをシングルステップで実行するための式内の中間ステージ):
$ofh = 選択(OUTF);
$~ = "私のその他の形式";
$^ = "My_Top_Format";
選択($ofh);
英語モジュールを使用する場合は、変数名を読み取ることもできます。
英語を使う;
$ofh = 選択(OUTF);
$FORMAT_NAME = "My_Other_Format";
$FORMAT_TOP_NAME = "My_Top_Format";
選択($ofh);
でも、あなたはまだ面白いものを持っています 選択する()s. したがって、FileHandle モジュールを使用するだけです。 では、あなた
代わりに小文字のメソッド名を使用して、これらの特殊変数にアクセスできます。
FileHandleを使用します。
format_name OUTF "My_Other_Format";
format_top_name OUTF "My_Top_Format";
ずっといい!
注意事項
値行には任意の式が含まれる可能性があるため(キャレットではなくアットフィールドの場合)
フィールド)、より高度な処理を他の関数にファームアウトできます。 sprintf()
またはあなた自身のもの。 例えば:
形式 ID =
@<<<<<<<<<<<<<<
&commify($n)
.
実際の at またはキャレットをフィールドに挿入するには、次のようにします。
形式 ID =
ここに@が付いています。
「@」
.
テキスト行全体を中央揃えにするには、次のような操作を行います。
形式 ID =
@|||||||||||||||||||||||||||||||||||
「何らかのテキスト行」
.
「これをページの右側にフロートさせる」という組み込みの方法はありませんが、
本当に絶望的な人は、その行き先を特定する必要があります。
現在の列数に基づいて独自の形式をその場で作成し、その後 eval() それ:
$format = "フォーマットSTDOUT = \n"
。 '^' 。 '<' x $cols 。 「\n」
。 '$entry' 。 「\n」
。 "\t^" 。 "<" x ($cols-8) 。 「~~\n」
。 '$entry' 。 「\n」
。 "。\n";
$Debugging の場合は $format を出力します。
評価 $format;
$ @の場合は$ @で死ぬ;
これにより、次のような形式が生成されます。
フォーマット STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<
$entry
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< <~~
$entry
.
これは少し似たような小さなプログラムです FMT(1):
形式 =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<> ~~
$_
.
$/ = '';
while (<>) {
s/\s*\n\s*/ /g;
書く;
}
フッター
$FORMAT_TOP_NAME には現在のヘッダー形式の名前が含まれていますが、
対応するメカニズムを使用して、フッターに対して同じことを自動的に実行します。 方法がわからない
大きなフォーマットは、大きな問題の XNUMX つであると評価するまでは変わりません。 オンです
やる事リスト。
これが XNUMX つの戦略です。固定サイズのフッターがある場合は、チェックを入れることでフッターを取得できます。
それぞれの前に $FORMAT_LINES_LEFT 書く() 必要に応じてフッターを自分で印刷します。
もう XNUMX つの戦略は次のとおりです。「open(MYSELF, "|-")」を使用して自分自身へのパイプを開きます (「open」を参照)
perlfunc) そして常に 書く() STDOUT ではなく MYSELF に送信します。 お子様に処理してもらいます
STDIN をマッサージして、ヘッダーとフッターを自由に再配置します。 あまり便利ではありませんが、
しかし実行可能です。
アクセスする 書式設定 内部
フォーマットメカニズムへの低レベルのアクセスには、次を使用できます。 フォームライン() $^A にアクセスします
($ACCUMULATOR 変数) を直接実行します。
例:
$str = フォームライン <<'END', 1,2,3;
@<<< @||| @>>>
終わり
print "うわー、'$^A' をアキュムレータに保存したところです!\n";
または、 書き込む() サブルーチン、つまり 書く() 何 sprintf() にある printf()、I
この:
鯉を使用します。
サブスライト{
croak "使用法: PICTURE ARGS を書き込む" (@_ を除く)
私の $format = シフト;
$^A = "";
フォームライン($format,@_);
$^A を返します。
}
$string = swrite(<<'END', 1, 2, 3);
見てくれよ
@<<< @||| @>>>
終わり
$ stringを出力します。
警告
形式を終了する単一のドットは、メッセージを通過するメール メッセージを途中で終了させることもあります。
インターネット メーラーの設定ミス (経験上、このような設定ミスはよくあることですが、
例外ではありません)。 したがって、メールで形式コードを送信するときは、次のようにインデントする必要があります。
フォーマット終了ドットが左マージンにないこと。 これにより、SMTP の切断が防止されます。
字句変数 (「my」で宣言) は、フォーマットが次のとおりである場合を除き、フォーマット内では表示されません。
字句変数のスコープ内で宣言されます。
プログラムの環境で LC_NUMERIC ロケールが指定されており、「ロケールを使用」が有効な場合
形式が宣言されると、ロケールは小数点文字を指定するために使用されます。
フォーマットされた出力。 フォーマットされた出力は、「ロケールの使用」によって制御できません。
書く() と呼ばれます。 ロケール処理の詳細については、perllocale を参照してください。
固定長テキストフィールドに表示される文字列内では、各コントロール
文字はスペースに置き換えられます。 (ただし、使用するときは「\r」の特別な意味に注意してください。
これは、一部の文字で制御文字が「消える」場合の位置ずれを避けるために行われます。
出力メディア。
onworks.net サービスを使用してオンラインで Perlform を使用する