質問

このシナリオ。大量のレガシーパートに分かれたスクリプトを当てるドキドキ感も楽しめる共図書館があります。とスクリプトを使用の"印刷"決のための診断出力に出力します。表示されるスクリプト-彼らは範囲が広く、その承認は、長年の実りあ谷の監視と制御が可能となります。

今の新しい必要が届い:ログインしかし、これだけでは現在のように図書館があります。これは自動的に実行されるので、透明なユーザーの標準ライブラリの必要な変更するためのイントロダクションです。共図書館の方法で単ング加えることによって、それが簡単です。の難しい部分はその診断出力からこれらのスクリプトが常に表示の"印刷"です。この診断出力を確保し、もっと重要なことは、処理されます。

例として、この処理は、ライブラリーを開発するだけの印刷ラインを含むもので、警告','エラー','通知"または"注目の'.以下の極めて些細なびたり、逆にコード例は、(tm)が記録の一部と出力:

sub CheckPrintOutput
{
    my @output = @_; # args passed to print eventually find their way here.
    foreach my $value (@output) {
         Log->log($value) if $value =~ /warning|error|notice|attention/i;
    }
}

(思うようになるの課題として何をすべき実際のログ','印刷で使用しないように診断','perlの吸い込み、この例では、傷のx y z'...これにより大幅に簡略化のための簡潔さ、透明度)

の基本的な問題を捉え、加工データに渡される印刷(又はそのperlが組み込み、その推論).高校を卒業したばかりです。ができ?あるログインモジュールとフックのせいですか?ているのか、あるいはそれを避けるように苦し、私にも撮影を加工したり、印刷出力?

追加:これはクロスプラットフォーム-windows*nixです。プロのスクリプトでなければならないのと同じで、なにから出力されます。

追加:興味深い提案にコメントのcodelogicの回答:

できるサブクラス http://perldoc.perl.org/IO/Handle.html して作成してください 自分のファイルハンドルのログインです。–Kamil Kisiel

このか、注意事項:

1)私がこの機能を使う人なら共図書館があります。いを適用しなければならない自動的に標準出力に出力しくSTDERRます。

2) IO::対応 文書によるとできないサブクラスでは、私の試みかどうかという虚.あなたが特に必要なsublclassing IO::対応す。標準使用ベース'IO::取扱い、その後継の新しい印刷方法がされていません。

最終編集:のように見えIO::ハンドルコーポレート-メッセージが提携::対応するものであります。全体的に提案;それらはすべて本当に良いです。今回の提携::取扱いルートに挑戦しました。場合の原因となる問題は今後も参加したいと思っていま!

補足:なお、その後のこのビットはその提携::取扱いをする仕事に就きない場合は何もする話です。をご利用の場合の特徴のIO::取扱いおつSTDOUT、およびSTDERRでは基本的にはcrapshootにおいて作業を確実に-を見つけられなかったわかりやすく伝えるためのautoflush方法IO::ハマ縛られます。いよautoflushいつの取り扱います。その作品は、いま、提携::取扱いルートが可能です。

役に立ちましたか?

解決

が構築することをオーバーライドすることができ覧 perlsub).しかし、 print の組込みコマンドが動作しないことです。の困難をオーバー print 詳細はこの perlmonkのスレッド.

ただし、 ができ

  1. 作成パッケージ
  2. タイハンドル
  3. この項目を選択します。

現在、カップルでの人の基本的な枠組みで行うようになります:

package IO::Override;
use base qw<Tie::Handle>;
use Symbol qw<geniosym>;

sub TIEHANDLE { return bless geniosym, __PACKAGE__ }

sub PRINT { 
    shift;
    # You can do pretty much anything you want here. 
    # And it's printing to what was STDOUT at the start.
    # 
    print $OLD_STDOUT join( '', 'NOTICE: ', @_ );
}

tie *PRINTOUT, 'IO::Override';
our $OLD_STDOUT = select( *PRINTOUT );

をオーバーライドすることができ printf 同じように

sub PRINTF { 
    shift;
    # You can do pretty much anything you want here. 
    # And it's printing to what was STDOUT at the start.
    # 
    my $format = shift;
    print $OLD_STDOUT join( '', 'NOTICE: ', sprintf( $format, @_ ));
}

タイ::対応 のためのすべてをオーバーライドすることができるSTDOUTいます。

他のヒント

あなたはSTDOUTをリダイレクトするを選択rel="noreferrer">のPerlの

open my $fh, ">log.txt";
print "test1\n";
my $current_fh = select $fh;
print "test2\n";
select $current_fh;
print "test3\n";

ファイルハンドルポストがあなたのログメッセージを処理し、別のプロセスには何もパイプ可能性があります。

はPerlIO ::ティーの中はPerlIO :: Utilののモジュールは、あなたが「ティー」にできますように思われます複数の宛先へのファイルハンドルの出力(例えば、プロセッサとSTDOUTを記録)。

の選択肢がたくさん。 ()にデフォルトを印刷するファイルハンドルを変更することを選択し使用してください。またはSTDOUTを結びます。それとも、それを再度開きます。それともにIO層を適用します。

これはあなたの問題への答えではないですが、あなたは、あなた自身の使用のためのロジックを採用することができるはずです。ない場合は、多分他の誰かがそれが役に立つでしょう。

、彼らが起こる前に、不正な形式のヘッダをキャッチ...

package PsychicSTDOUT;
use strict;

my $c = 0;
my $malformed_header = 0;
open(TRUE_STDOUT, '>', '/dev/stdout');
tie *STDOUT, __PACKAGE__, (*STDOUT);

sub TIEHANDLE {
    my $class = shift;
    my $handles = [@_];
    bless $handles, $class;
    return $handles;
}

sub PRINT {
    my $class = shift;
    if (!$c++ && @_[0] !~ /^content-type/i) {
        my (undef, $file, $line) = caller;
        print STDERR "Missing content-type in $file at line $line!!\n";
        $malformed_header = 1;
    }
    return 0 if ($malformed_header);
    return print TRUE_STDOUT @_;
}
1;

使用方法:

use PsychicSTDOUT;
print "content-type: text/html\n\n"; #try commenting out this line
print "<html>\n";
print "</html>\n";

あなたは、元のスクリプトのstdoutをキャプチャし、どこかに賢明な出力を書き込みラッパースクリプトからスクリプトを実行することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top