2014-02-27 3 views
0

저는 인수를 전송하는 또 다른 서브 루틴을 호출하고 문자열을 추가해야하는 서브 루틴 (Perl)이 있습니다. 나는 이런 식으로 뭔가를 시도했다 (하지만 난 그냥이를 수정하지, 대답을 찾고 있어요 ...) :서브 루틴에서 서브 루틴을 호출하십시오.

sub TestBase($) 
{ 
    print @_; 
    return 'hard processed string'; 
} 

sub Test($) 
{ 
    print @_; 
    return TestBase(@_, 'Filename.txt'); 
} 

이 사람은 "주 :: TestBase에 대한 너무 많은 인수"(이 모든 년 실패 그리고 여전히 cmd.com을 사용합니다.이 경우에는 쉽게 복사하여 붙여 넣지 않습니다!).

+0

, 나는 주어진 시간, 파이썬과 출력을 해요 그리고 욕망은 내가 대신 루비를 배우는 것을 선호합니다. Perl 설명서가 광범위하지 않기를 바랄뿐입니다. – Liviu

+0

JavaScript는 함수를 전달하는 데 가장 적합합니다. –

+0

@Dan Dascalescu Perl에서 사용하고있는 것이기 때문에 (그리고 나는 그들을 화나게하고 싶지 않습니다!). 나는 언어를 바꿀 수 없다. – Liviu

답변

1

Dan의 답변에 대한 나의 수정 사항을 명확하게 요약하면 다음과 같습니다.

서브 루틴 프로토 타입을 제거하고 서브 루틴 이름과 동일한 줄에 괄호를 넣고 (예 : perldoc perlstyle) 소문자로 변경했습니다. 대문자는 일반적으로 패키지와 같은 전역 변수에 대해 예약되어 있습니다. 이름)을 삭제하고 return 키워드를 삭제했습니다.

특히 다른 사람이 의존하는 코드를 작성하는 경우 해당 서브 루틴 이름을 그대로 두는 것이 가장 바람직합니다. 수용된 연습은 중요하지만 기존 코드 기반에 대한 인터페이스를 정적으로 유지하는 것만 큼 중요하지는 않습니다.

#!/usr/bin/perl 

use strict; 
use warnings; 

sub test_base { 
    print @_; 
    'hard processed string'; 
} 

sub test { 
    print @_; 
    test_base(@_, 'Filename.txt'); 
} 

my $retval = test('A', 'B', 'C'); 
print "\n\n", $retval, "\n"; 

내가 펄을 모르는

ABCABCFilename.txt 

hard processed string 
+0

원래 서브 루틴의 범위가 해당 파일임을 거의 확신합니다. 몇 가지 작은 추가 (당분간)를 예정하고 있지만, 당신의 추천을 포함 시켜서 다음 주에 1-2 시간 동안 지속될 것으로 기대합니다. 그럼 난 아마 당신의 대답을 받아 들일 것이다, 노력에 감사드립니다! – Liviu

+0

그건 그렇고, 펄 스타일을 위해서 스크립트를 체크하지 않겠습니까? 내 눈이 약해. – Liviu

+0

@Liviu : 서브 루틴을 * 호출 할 수있는 범위를 의미한다면 * 현재 패키지 * 내에 있습니다. 컴파일 유닛 내에'package' 문이 없다면 전역 변수는'main' 패키지에 들어갑니다. 모든 패키지의 서브 루틴은 패키지 이름으로 완전히 규정 된 경우 호출 될 수 있습니다. – Borodin

4

Perl 모범 사례 : don't define function prototypes 실제로 무엇을하는지 모르는 경우.

#!/usr/bin/perl -w 
use strict; 

sub test_base { 
    print @_; 
} 

sub test { 
    print @_; 
    return test_base(@_, 'Filename.txt'); 
} 

test('foo', 'bar'); 
+2

http://stackoverflow.com/questions/297034/why-are-perl-5s-function-prototypes-bad – Alnitak

+0

나는 그것을 얻지 않는다 : 누군가 (이 Alnitak?) 왜냐하면 당신이 downvoted ... 당신은 사용하고있다. 프로토 타입? 어디에? 'Sub testBase ($)'는 초기 코드에서이를 수행합니다. – Liviu

+0

그것은 나의 downvote가 아니었다 – Alnitak