Perl脚本能否检测它是否';它是在Activestate和草莓Perl下运行的?

Perl脚本能否检测它是否';它是在Activestate和草莓Perl下运行的?,perl,detection,activeperl,strawberry-perl,Perl,Detection,Activeperl,Strawberry Perl,我有一个Perl脚本,我仍在尝试调试,在调试过程中,我注意到它在ActivePerl和草莓Perl下运行时的行为有所不同 这让我想知道Perl脚本是如何检测它运行在哪种风格下的。您可以检查这两种Perl是如何使用 perl -V 一旦你们发现是什么差异导致了你们的问题,你们可以使用软件包来检测特定的特性。要列出所有设置,请执行以下操作: perl -MConfig -MData::Dump -e "dd \%Config" Windows上的ActivePerl始终(或至少从Perl 5.0

我有一个Perl脚本,我仍在尝试调试,在调试过程中,我注意到它在ActivePerl和草莓Perl下运行时的行为有所不同


这让我想知道Perl脚本是如何检测它运行在哪种风格下的。

您可以检查这两种Perl是如何使用

perl -V
一旦你们发现是什么差异导致了你们的问题,你们可以使用软件包来检测特定的特性。要列出所有设置,请执行以下操作:

perl -MConfig -MData::Dump -e "dd \%Config"

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中引入,因此在真正的旧版本上不起作用。

ActiveState Perl,因为813.1版默认提供ActivePerl包(无需加载任何模块),而其他版本的Perl可能不提供。至少Perl5.20.1没有。您可以使用类似于以下的代码来确定脚本是否正在通过ActiveState Perl运行:

if (exists $::{'ActivePerl::'}) {
  # getting called through ActiveState Perl
} else {
  # not getting called through ActiveState Perl
}

有关ActivePerl模块的更多信息,请参阅。

我能看到的唯一有用的区别是,草莓Perl将自己的名字放在
uname
中,而ActivePerl只有一个空白的
uname
。这使得其他一些Windows Perl可能与ActivePerl混淆。这不是一个完美的情况,但可能我们所有的……另外,
Data::Dump
在草莓Perl上默认情况下似乎不可用。Hacky但是它可以工作,而且似乎没有非Hacky解决方案(-: