2017-03-23 18 views
1

私はPerlパイプラインを書いています。これは、さまざまな他のプログラムを呼び出し、一方から他方へデータを渡すスクリプトです。スクリプト(pipeline.plと呼ぶ)とそれが管理するさまざまなサブスクリプトは、subroutines.phで定義され、require subroutines.phディレクティブで定義された共通サブルーチンのリストを共有します。Perlサブルーチンは、それを呼び出した行をどのように報告できますか?

これらの一つは、ジョブのエラーメッセージを(実際のサブルーチンはまた、いくつかの他の仕事をし、彼らはここでは関係ありませんね。いや、私はdie()を再発明わけではない)、印刷終了している機能である:

## subroutines.ph 
sub errorDie 
{ 
    my ($errMsg) = @_; 
    ## various other cleanup tasks here 
    die($errMsg); 
} 
1; 

そして、pipeline.pl中:結果の上にスクリプトを実行

#!/usr/bin/perl 
require 'subroutines.ph'; 

errorDie("foo") 

中:

foo at subroutines.ph line 5. 

それは代わりのようなものを報告することが可能です:だから

foo at pipelines.pl line 4. 

を、代わりにdie()がオンに見つかった行を報告する、それがerrorDieサブルーチンが呼び出された元のスクリプトの行を報告しなければなりません。私は$errMsg変数にその行を含めることでこれを行うことができることを知っていますが、それは壊れやすく厄介です。これは自動的にできますか?外部ファイルで定義されたサブルーチンは、呼び出し元を検出できますか? callerあり

+2

あなたがカープを知りました。私はあなたが使う必要があると思う。このリンクを参照してください。 - http://perldoc.perl.org/Carp.html – Mohit

+0

@Mohit oh wow。はい、私は「鯉」について知っていましたが、それは自動的にこれを行ったのか分かりませんでした。ありがとう! – terdon

+1

@terdon:これはかなり*すべて*です! – Borodin

答えて

4

これはCarpcroakのポイントです。

Pkg.pm

package Pkg; 

use Carp qw(croak); 

sub some_func { 
    my ($cmd, $param) = @_; 

    $cmd eq 'encode' || $cmd eq 'decode' 
     or croak("Invalid command \"$cmd\""); 

    # ... 
} 

1; 

a.pl

use Pkg; 

Pkg::some_func('foo', 'bar'); 

出力:

Invalid command "foo" at a.pl line 3. 
6

は、これを行うには: https://perldoc.perl.org/functions/caller.html

my ($package, $filename, $line) = caller; 

はあなたが必要な情報を提供します。

しかし、一般的にデバッグについて話しているので、前述のようにから完全なバックトレースを取得できます。

+0

受け入れを別の回答に切り替えることは申し訳ありませんが、実際の例が示されているので、ページの上部にその例が表示されるようにしてください。しかし、ありがとう! – terdon

+0

ようこそ。それは自分でしなければならない。 – nlu

関連する問題