2013-03-01 2 views
3

배열로 수행 할 연산 집합을 시도하고 있습니다. 이를 위해 서브 루틴 참조를 전달해야합니다. 배열을 사용하지 않고이 작업을 수행 할 수있는 다른 방법이있을 수 있지만 다른 특정 제한 조건으로 인해 이것이 현재로서는 최선이라고 생각합니다.Perl이 서브 루틴 참조로 내장 함수로 구현되었습니다.

Tested 
Undefined subroutine &main::shift called at temp2.pl line 22. 

쿼리 - 그것은 참고로 서브 루틴에 내장 통과 할 수 있나요 : 내가 뭘하려고 오전에

기본 샘플 코드 :

#!/usr/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 
sub test() 
{ 
    print "Tested\n"; 
} 

my $test; 
my @temp = (1, 2, 3); 
my $operations = [ 
      [\&test, undef, undef], 
      [\&shift, \$test, \@temp], 
      ]; 

foreach(@$operations){ 
    my $func = shift $_; 
    my $out = shift $_; 
    $$out = $func->(@$_); 
} 

print Dumper $test; 

출력 관찰은?

이미 이전 검색어가 있는데, here에 서브 루틴 참조로 내장 된 기능이 내장되어 있습니다.

질문에 대해 3 년 동안 더 궁금한 점이 있었지만 지금은 대안이 있는지 궁금해하고있었습니다. 이 시나리오에서 기본 제공 함수와 사용자 정의 하위 루틴이 구분되는 이유를 설명하는 사람이 있습니까?

+1

은'보이는 $$ 밖으로 = $ FUNC -> ($ _)' – ysth

+0

덕분에 업데이트 ... ysth 따라 – Sid

답변

7

shift은 하위가 아닙니다. and+과 같은 연산자입니다. 하위 참조를 원하면 하위를 만들어야합니다. 무슨 뜻처럼

[sub { shift(@{$_[0]}) }, \$test, \@temp], 
+0

시프트 펄 도움의 함수로로 표시됩니다. 함수와 서브 루틴간에 차이가 있습니까? 둘 다 똑같은 것을 의미한다고 가정하고있었습니다. – Sid

+1

@Sid, perlfunc의 개 행 : "이 섹션의 함수는 표현식의 용어로 사용될 수 있으며 목록 연산자와 명명 된 단항 연산자의 두 가지 주요 범주로 분류됩니다." – ikegami

+1

참조 용 - ikegami의 확장 응답 : http://stackoverflow.com/questions/7167599/what-are-perl-built-in-operators-functions/7167873#7167873 – Sid