我有一個Perl腳本,我還在努力調試,並在這個過程中我注意到,它的行爲不同的ActivePerl和草莓的Perl下運行。一個Perl腳本可以檢測是否它的ActiveState下運行VS草莓的Perl?
這使我想知道一個Perl腳本會如何檢測在這些口味的它正在運行。
我有一個Perl腳本,我還在努力調試,並在這個過程中我注意到,它的行爲不同的ActivePerl和草莓的Perl下運行。一個Perl腳本可以檢測是否它的ActiveState下運行VS草莓的Perl?
這使我想知道一個Perl腳本會如何檢測在這些口味的它正在運行。
在Windows上的ActivePerl總是(或者至少是因爲Perl 5.005)定義了Win32::BuildNumber()
功能,這樣你就可以在運行時檢查它:
if (defined &Win32::BuildNumber) {
say "This is ActivePerl";
}
else {
say "This is NOT ActivePerl";
}
如果你想檢查對於其他平臺上的ActivePerl,則應該使用ActivePerl::BUILD()
函數。它只在ActivePerl 5.8.7 build 814中引入,所以它不適用於真正的舊版本。
可以研究如何既皮爾斯已經編譯
perl -V
一旦你發現了什麼差異造成您的問題,您可以使用Config包檢測特定的功能。要列出所有設置:
perl -MConfig -MData::Dump -e "dd \%Config"
我能看到的唯一有用的區別是Strawberry Perl將自己的名字放在'uname'中,但ActivePerl只有一個空白的'uname'。這使得一些其他Windows Perl可能與ActivePerl混淆。不是一個完美的情況,但也許我們所有的... – hippietrail 2011-03-10 16:15:23
也'數據:: Dump'似乎並沒有提供默認草莓Perl的。 – hippietrail 2011-03-11 01:56:19
自版本813.1起,ActiveState Perl默認提供了ActivePerl包(無需加載任何模塊),而其他版本的Perl可能不會。至少草莓Perl 5.20.1不會。您可以使用相似的代碼下面找出是否你的腳本通過的ActiveState Perl的正運行:
if (exists $::{'ActivePerl::'}) {
# getting called through ActiveState Perl
} else {
# not getting called through ActiveState Perl
}
有關的activeperl模塊的詳細信息,請參閱http://docs.activestate.com/activeperl/5.8/lib/ActivePerl.html。
哈克,但它的工作原理和似乎沒有非hacky解決方案( - : – hippietrail 2011-04-27 15:45:26