2010-07-21 30 views
6

Perl 5.10和5.12的一些新功能(例如「say」)被定義爲功能,您可以使用「功能」雜注來顯式啓用或禁用該功能。但是其他添加項,如命名的正則表達式捕獲組,是隱含的。我可以確保在5.10+上編寫的Perl代碼將在5.8上運行嗎?

當我使用5.10+解釋器編寫Perl,但希望它也能在5.8上運行時,我可以讓Perl抱怨使用任何不在5.8的東西嗎?很顯然,在你打算運行的所有主要版本上測試你的代碼是一種很好的做法,但是讓Perl自動發出警告仍然很不錯。

+2

另請參閱:http://stackoverflow.com/questions/2500892/how-can-i-test-when-a-feature-was-added-to-perl – mob 2010-07-21 15:55:12

回答

8

當我想確保某個程序將在特定版本的perl下運行時,我會在該版本的perl下測試它。我的release應用程序在實際上傳之前在多個perls下進行測試的功能。

這要求你有一個正確的測試套件並寫足夠的測試。很容易同時維護幾個單獨的perl安裝,就像我在有效的Perl編程中展示的一樣。

Test::MinimumVersion幾乎聽起來像它可能工作,但它有幾個限制。它只看你給它的文件(所以它不會檢查你加載的任何東西),而且我不認爲它實際上看起來在正則表達式模式中。每一個這些報告的最低版本是5.004,這是不正確的任何一個:

#!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,如use feature等。但是,這不是啓用功能的唯一方法。而且,正如你會注意到的那樣,它會錯過諸如/p這樣的標誌,至少在有人爲此添加支票之前。但是,您總是會使用PPI解決方案來追求類似的情況。

只需編譯它,運行測試並找出它就更容易了。

+0

感謝您的深入解答(如往常一樣)。我們的問題與往常一樣,是沒有測試的大量舊代碼。不過,我看到你的答案是正確的,接受。 – 2010-07-21 17:34:27

+0

「說」可以通過Perl6添加::說9(我自己在5.8.8時使用它) - 所以我不打算在Perl :: MinimumVersion中添加檢查。正則表達式太難添加,但應添加「給定」和「何時」。 – 2010-07-21 19:49:08

+0

我應該注意到這個問題並不是Perl :: MinimumVersion,而是Perl中靜態分析的想法。 PPI很棒,但是我們理解它所分析的內容的能力根本上是有問題的,因爲Perl很特殊。 :) – 2010-07-21 20:27:10

4

我不認爲你可以讓Perl檢查你運行的代碼,但 檢出Perl::MinimumVersionTest::MinimumVersion。 (後者只是圍繞前者的包裝。)

+0

你有什麼工作?我認爲這不會有幫助。 – 2010-07-21 16:45:38

+0

嗯,我從來沒有嘗試過,但這是它試圖解決的問題。如何解決這個問題是另一個問題。 – cjm 2010-07-21 17:19:07

1

那麼從閱讀其他答案你的答案是否定的,但也許App::perlbrew可以幫助您安裝和管理多個版本的Perl測試。

相關問題