【问题标题】:How can I detect the operating system in Perl, then conditionally execute commands?如何在 Perl 中检测操作系统,然后有条件地执行命令?
【发布时间】: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


    【解决方案1】:

    您可以像这样使用调度表:

    my %callback = (
        MSWin32 => sub { win_code() },
        linux   => sub { linux_code() },
    );
    
    # run appropriate code
    $callback{$^O}->();
    

    【讨论】:

    • +1 谢谢,如果不清楚,我对 Perl 一无所知。也就是说,我确实在 ptkdb 中运行了代码以查看它在做什么;似乎创建了一个哈希表,然后用作查找。我不知道如何将该代码转换为“If then”语句。有什么建议么?谢谢!
    • @blunders 试试这个:if ($^O =~ /win/i) { windows_code() } else { linux_code() }
    • @blunders,实际上还没有人说过,但$^O 包含操作系统信息,请参阅perldoc.perl.org/perlvar.htmlperldoc.perl.org/perlport.html 了解更多信息
    【解决方案2】:

    看看File::Spec是怎么做到的。

    Here.


    回复评论:

    我并不是说要加载 File::Spec。我是说看看它是如何进行“子分类”的。真的,有点像这样:

    • 对象具有多态性。
    • 多态是满足您需要的最简单方法。
    • 创建一个通用的实现模式,
    • 然后那些你将使用它的平台实现它。

    File::Spec 试图完成所有这些,因为它是一个 CPAN 模块。但只需看看它是如何做到的,看看它是如何将平台折叠成机箱的。因为它是一个核心和推荐的模块,所以按照这个模式你可能不会出错。

    如果您的平台不适合这种模式,那么您将不得不使用其他方法来检测平台。文件系统差异可能不是您需要担心的唯一差异。

    确切地说,我对 FS 实现多态性的方式并不完全 100% 满意。但它一种策略。以及处理具有多态性的平台的示例。

    仅供讨论:我更喜欢额外的课程。我会将所有 FS 实现基于一个抽象类。最重要的是,我会将这种行为子类化为实现,并且在此之上我会放置我最喜欢的模式之一 Facade/Factory 类,它是该类的公共面孔。

    【讨论】:

    • +1 谢谢,查看了代码。看来您是说要加载 File::Spec 模块来做一些只有 Perl 应该能够单独完成的事情。这是正确的,还是我错过了什么?此外,没有遵循代码是否提供了我能够将命令传递给的条件逻辑;这是我问题的核心。谢谢!!
    【解决方案3】:

    当然,$^O 是这个问题的明确答案。但是您可能想查看Devel::CheckOS,它对其进行了友好的包装。

    【讨论】:

    • 同意,这是一个超级用户友好的包装器——感谢分享。您是否愿意在“使用 Perl 进行数据处理”的博客上发布更新... :-) ...干杯!!
    • 哦,我想了很多。然后我想“如果我有更多的空闲时间”:-/
    猜你喜欢
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 1970-01-01
    相关资源
    最近更新 更多