코드 범위가 거의 100 % 인 테스트 제품군을 사용하는 경우 모든 통화 사이트를 찾을 수 있습니다.
호출 스택의 위치에 대한 인수 감안할 때 caller
내장 반환
- 호출자의 패키지 이름
- 파일 이름
- 행 번호
- 완전한 하위 이름
- ... 일부 more
이제 호출 위치를 기록하는 코드를 추가 할 수 있습니다. 자동 처리를 위해 결과를 데이터 구조에 넣거나 로그 파일에 보고서를 작성할 수 있습니다. 예 :
sub this_logs {
{
# seperate scope to not pollute your sub
state $log_fh //= do {
open my $fh, ">", "record_callsites.log"; # assuming autodie;
$fh;
};
state $seen = {};
my (undef, undef, undef, $sub) = caller(1);
my ($package, $file, $line, ) = caller(0);
my $site = $sub ? "$sub()" : "pkg $package";
unless ($seen->{$file}{$line}++) {
say {$log_fh} "CALL from $site at $file line $line";
}
}
my ($param1, $param2) = @_;
# etc
}
이 가정의 모든 코드는이 로그 파일을 생성 할
this_logs(1, 2, 3); # direct call
foo(); # call from same package
my $sub = "this_" . "logs";
baz($sub); # call by name
Foo::bar(); # call from different package
foo(); # duplicate call
sub foo {
return this_logs(5, 6, 7);
}
sub baz {
shift()->(1, 2, 3); # no strict refs for this, please
};
package Foo;
sub bar {
main::this_logs();
}
했다
그래서 적절한 테스트 스위트를 제공 (파일 이름 -
은 STDIN을 의미)
CALL from pkg main at - line 20
CALL from main::foo() at - line 28
CALL from main::baz() at - line 31
CALL from Foo::bar() at - line 3
, 이 전화를 걸 수없는 전화 사이트를 찾을 수 있습니다.
가 아닌 바보 같은 편집기가있는 경우, 당신은 또한 차례로 각 파일을 열고 올바른 줄에 커서를 위치 스크립트 방출 수 : 내가 바로 가기가 잘 모르는 것 같아요
say "kate -l $line $file";
say "vim +$line $file";
을하지만, 메서드에 대한 호출을 안정적으로 찾는 문제 또는 새 인터페이스를 준수하도록 편집하는 문제입니까? –
찾기가 쉽습니다. 모든 인스턴스는 하나의 패키지에 있으며 grep을 사용하여 찾을 수 있습니다. 그것은 편집 문제입니다.나는 호출 매개 변수 목록을 폭발시키고 그것을 다시 결합하는 스크립팅을 할 수는 있지만 이것은 주문품 일 가능성이 높습니다. 이제는 내 자신의 리팩터링 모듈을 작성해야 할 때입니다. – chooban
통화가 여러 줄에 걸쳐 확산되는 경우가 있으므로 그 매개 변수를 생성하기 위해 사소한 계산이 진행되고 있다고 가정합니다. 따라서 매개 변수를 제거하는 것만으로 언급 된 계산 중 일부가 제거 될 수 있기 때문에 많은 호출 사이트에서 수동 정리가 필요할 것으로 예상됩니다. 예를 들어 통화가 중복되기 전의 직선이있을 수 있습니다. – jlh