2017-03-23 1 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에 :

foo at subroutines.ph line 5. 
,369 :

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

errorDie("foo") 

는 결과 위의 스크립트를 실행

foo at pipelines.pl line 4. 

그래서,에 발견 된 대신 라인 die()을보고, 그것은 errorDie 서브 루틴이 호출 된 원래 스크립트의 라인을보고해야합니다 :

는 대신 같은 것을보고이 그것을 가능 . $errMsg 변수에 줄을 포함 시켜서이 작업을 수행 할 수 있다는 것을 알고 있지만, 그것은 깨지기 쉽고 번거 롭습니다. 이 작업을 자동으로 수행 할 수 있습니까? 외부 파일에 정의 된 서브 루틴이 호출 된 위치를 감지 할 수 있습니까? caller 있습니다

+2

당신이 잉어에 대해 듣고 않았다. 나는 그것이 당신이 사용해야하는 것이라고 생각합니다. 이 링크 - http://perldoc.perl.org/Carp.html – Mohit

+0

@ 모토 와우. 그렇습니다. 나는 '잉어'에 대해 알고 있었지만, 자동적으로 그 사실을 몰랐습니다. 감사! – 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

관련 문제