【发布时间】:2011-03-04 17:35:02
【问题描述】:
在“How can I detect the operating system in Perl”上找到了这个问题——但是我需要对检测操作系统的 Perl 进行 sn-p,然后使用该值来有条件地执行 OS-A 或 OS-B 的代码;在这种情况下,那些是 Windows7 和 CentOS-5.5。
问题、反馈、请求——只需发表评论,谢谢!!
【问题讨论】:
标签: perl operating-system detection
在“How can I detect the operating system in Perl”上找到了这个问题——但是我需要对检测操作系统的 Perl 进行 sn-p,然后使用该值来有条件地执行 OS-A 或 OS-B 的代码;在这种情况下,那些是 Windows7 和 CentOS-5.5。
问题、反馈、请求——只需发表评论,谢谢!!
【问题讨论】:
标签: perl operating-system detection
您可以像这样使用调度表:
my %callback = (
MSWin32 => sub { win_code() },
linux => sub { linux_code() },
);
# run appropriate code
$callback{$^O}->();
【讨论】:
if ($^O =~ /win/i) { windows_code() } else { linux_code() }
$^O 包含操作系统信息,请参阅perldoc.perl.org/perlvar.html 和perldoc.perl.org/perlport.html 了解更多信息
看看File::Spec是怎么做到的。
回复评论:
我并不是说要加载 File::Spec。我是说看看它是如何进行“子分类”的。真的,有点像这样:
File::Spec 试图完成所有这些,因为它是一个 CPAN 模块。但只需看看它是如何做到的,看看它是如何将平台折叠成机箱的。因为它是一个核心和推荐的模块,所以按照这个模式你可能不会出错。
如果您的平台不适合这种模式,那么您将不得不使用其他方法来检测平台。文件系统差异可能不是您需要担心的唯一差异。
确切地说,我对 FS 实现多态性的方式并不完全 100% 满意。但它是一种策略。以及处理具有多态性的平台的示例。
仅供讨论:我更喜欢额外的课程。我会将所有 FS 实现基于一个抽象类。最重要的是,我会将这种行为子类化为实现,并且在此之上我会放置我最喜欢的模式之一 Facade/Factory 类,它是该类的公共面孔。
【讨论】:
当然,$^O 是这个问题的明确答案。但是您可能想查看Devel::CheckOS,它对其进行了友好的包装。
【讨论】: