2010-07-21 3 views
6

"말"과 같은 Perl 5.10 및 5.12의 새로운 기능 중 일부는 "기능"플러그 인을 사용하여 명시 적으로 활성화 또는 비활성화 할 수있는 기능으로 정의됩니다. 그러나 regexes의 명명 된 캡처 그룹과 같은 다른 추가 사항은 암시 적입니다.5.10 이상으로 작성된 Perl 코드가 5.8에서 실행되도록 할 수 있습니까?

5.10 이상의 인터프리터를 사용하여 Perl을 작성했지만 5.8에서도 실행되도록하려면 5.8에없는 항목을 사용하는 것에 관해 Perl이 불평하도록 만들 수 있습니까? 분명히, 실행하고자하는 모든 주요 버전에서 코드를 테스트하는 것이 좋지만 Perl이 자동으로 경고하도록하는 것이 좋습니다.

+2

참조 : http://stackoverflow.com/questions/2500892/how-can-i-test-when-a-feature-was-added-to-perl – mob

답변

8

프로그램이 특정 버전의 perl에서 실행되도록하려면 해당 버전의 perl에서 테스트합니다. 내 release 응용 프로그램의 기능은 실제로 업로드하기 전에 여러 perls에서 테스트합니다.

이렇게하려면 적절한 테스트 슈트가 있고 충분한 테스트를 작성해야합니다. 동시에 여러개의 perl 설치를 유지하는 것은 쉽습니다. Effective Perl Programming에 나와 있습니다.

Test::MinimumVersion 거의 작동하는 것처럼 들리지만 몇 가지 제한 사항이 있습니다. 그것은 단지 당신이 그것을주는 파일을 보았습니다 (그래서 당신이로드하는 것을 검사하지 않을 것입니다), 그리고 실제로 그것이 정규식 패턴을 들여다 보지 않는다고 생각합니다. ,

#!perl 

use Perl::MinimumVersion; 

my $p_flag = <<'SOURCE'; 
'123' =~ m/[123]/p; # 5.10 feature 
SOURCE 

my $named_capture = <<'SOURCE'; 
'123' =~ m/(?<num>[123])/; # 5.10 feature 
SOURCE 

my $r_line_ending = <<'SOURCE'; 
'123' =~ m/[123]\R/p; # 5.12 feature 
SOURCE 

my $say = <<'SOURCE'; 
say 'Hello'; 
SOURCE 

my $smart_match = <<'SOURCE'; 
$boolean = '123' ~~ @array; 
SOURCE 

my $given = <<'SOURCE'; 
given($foo) { 
    when(/123/) { say 'Hello' } 
    }; 

SOURCE 

foreach my $source ($p_flag, $named_capture, $r_line_ending, $say, $smart_match, $given) { 
    print "----Source---\n$source\n-----"; 
    my $version = Perl::MinimumVersion->new(\$source )->minimum_version; 
    print "Min version is $version\n"; 
    } 

는 소스가 이미 제공한다는 힌트를 찾기 때문 Perl::MinimumVersion 작품이 이유의 일부, 같은 use 5.010 : 이들 각각은 그 중 하나에 대해 사실이 아니다있는 최소 버전은 5.004 것을보고 및 use feature 등등. 그러나 이것이 기능을 활성화하는 유일한 방법은 아닙니다. 그리고 누군가가 수 표를 추가 할 때까지 적어도 /p 플래그와 같은 것을 누락합니다. 그러나 PPI 솔루션을 사용하면 항상 그런 식으로 쫓을 것입니다.

그냥 컴파일하고 테스트를 실행하고 알아내는 것이 더 쉽습니다.

+0

(평소와 같이) 놀랍도록 심오한 답변을 보내 주셔서 감사합니다. 우리의 문제는 너무 자주, 테스트없이 오래된 코드 톤입니다. 그럼에도 불구하고 나는 당신의 대답이 합당하다는 것을 알고 있습니다. –

+0

"Perl6 :: Say 9 (5.8.8을 사용할 때 직접 사용)로 추가 할 수 있습니다. 따라서 Perl :: MinimumVersion에서 이에 대한 확인을 추가 할 계획이 아닙니다. Regexes는 추가하기가 너무 어렵지만 "given"과 "when"을 추가해야합니다. –

+0

필자는이 문제가 Perl :: MinimumVersion이 아니라 Perl의 정적 분석이라는 아이디어에주의해야합니다. PPI는 멋지지만 Perl이 특별하기 때문에 파싱 된 내용을 이해하는 우리의 능력은 근본적으로 문제가됩니다. :) –

4

코드를 실행할 때 Perl 확인을 수행 할 수 있다고 생각하지 않지만 체크 아웃 Perl::MinimumVersionTest::MinimumVersion을 확인하십시오. 후자는 전자의 래퍼 인 Test::Builder입니다.

+0

이 기능이있는 곳이 있습니까? 나는 그것이 도움이 될 것이라고 생각하지 않는다. –

+0

글쎄, 나 자신을 시도한 적이 없지만 이것이 문제를 해결하려고 시도하고있다. 그것이 얼마나 잘 해결되는지는 또 하나의 질문입니다. – cjm

1

다른 대답을 읽지 못했지만 대답은 no이지만 아마도 App::perlbrew은 여러 버전의 perl을 설치하고 관리하는 데 도움이 될 수 있습니다.

관련 문제