을 존재하는 경우는, 내가 $의 FN에 명명 된 서브 루틴이 정의 된 테스트합니까 어떻게 펄 테스트 나는 서브 루틴의 이름을 한 경우 상징적 인 함수 이름이
$type = 'Circle';
$fn = 'My'.$type.'Renderer';
말?
을 존재하는 경우는, 내가 $의 FN에 명명 된 서브 루틴이 정의 된 테스트합니까 어떻게 펄 테스트 나는 서브 루틴의 이름을 한 경우 상징적 인 함수 이름이
$type = 'Circle';
$fn = 'My'.$type.'Renderer';
말?
can
메서드를 사용하고 싶은 유혹을받을 수 있지만 잘못되었으므로 상속을 받으면 오탐이 발생할 수 있습니다. exists
을 사용하려고합니다.
my $name = ...;
my @args = ...;
die("$name doesn't exist\n") if !exists(&$name);
(\&$name)->(@args);
$name->(@args)
으로 충분할 것이다. 이상한 구문은 엄격한 것을 우회합니다.
이것은 물론 상속 확인 *이 필요하지 않다고 가정합니다. –
@ 로버트 P, 가정이 아닙니다. 그것은 OP가 요청한 것입니다 ("** 서브 루틴 **이 명명 된 경우 어떻게 테스트합니까?"). 그는 방법에 관해 묻지 않았다. subs에 대해서는'exists' (또는'defined'), 메소드에는'can'을 사용합니다. – ikegami
사실, 둘 다 흥미로운 경우지만, 내 경우에는 패키지에 서브 루틴을 호출하는 주 프로그램이 있다는 것입니다. 그 서브 루틴에서 주 프로그램이나 내로드 패키지를 포함하여 주어진 이름으로 부를 수 있는지 알아야합니다. – Don
+1'PACKAGE-> can ($ fn)'(종종'main-> can ($ fn)'). '정의 된 '테스트는 나를 가렵 게 만듭니다. –
예, 실제로, 패키지 -> 할 수 있습니다. & {$ fn}을 (를) 정의한다고 생각했지만 간단한 테스트를 망쳤습니다. 이것은 Stack Overflow와 쌍 프로그래밍과 같습니다. 고마워. – Don