【问题标题】:How can I check if a Perl module is installed on my system from the command line?如何从命令行检查我的系统上是否安装了 Perl 模块?
【发布时间】:2010-11-05 13:30:54
【问题描述】:

我尝试检查我的系统中是否安装了 XML::Simple。

perl -e 'while (<@INC>) { while (<$_/*.pm>) { print "$_\n"; } }'

上面的单行用于列出我系统中安装的所有模块。但是,它没有列出 XML 模块。

但是,以下执行正常。

perl -e "use XML::Simple "

可能是什么问题?

【问题讨论】:

  • @Sinan:你把问题改得太多了。我认为最初的问题是如何找出模块的安装位置。现在是是否安装了模块。
  • 我真的不知道。但是考虑到当前的问题,您的答案几乎是迄今为止最好的。也许 Chells 可以启发我们。
  • @Sinan:当 perl-modules 几乎不被使用时,你为什么要从 perl-module 重新标记到 perl-modules?

标签: perl command-line perl-module


【解决方案1】:

您可以通过以下方式检查模块的安装路径:

perldoc -l XML::Simple

您的单线问题在于,它不是递归遍历目录/子目录。因此,您只会得到实用的模块名称作为输出。

【讨论】:

  • 当然,这只有在您要查找的模块包含 POD 时才有效。
  • @Manni:应该与大多数模块(来自 CPAN)一起使用,因为它们都已记录在案。
  • 其中一些文档记录得很好,以至于他们将文档放在自己的 .pod 文件中。这是一个很好的技巧,大部分时间都适用于那个小问题。
  • 这仅在模块包含 Pod 时有效。奇怪但真实。
  • 您应该使用-lm 而不是-l。它是一样的,只是如果模块没有 POD,它也可以工作。
【解决方案2】:

你在那里做的不是递归到目录中。它只列出@INC 目录的根目录中的模块。

模块XML::Simple 将存在于XML/Simple.pm 下的@INC 路径之一中。

他上面说的找到具体的模块。

CPAN 解释了如何在此处找到所有模块,请参阅How to find installed modules

【讨论】:

    【解决方案3】:
    $ perl -MXML::Simple -le 'print $INC{"XML/Simple.pm"}'

    来自%INC 上的perlvar 条目:

    • %INC

    哈希 %INC 包含通过 dorequireuse 运算符包含的每个文件名的条目。键是您指定的文件名(模块名称转换为路径名),值是找到的文件的位置。 require 运算符使用此哈希来确定是否已包含特定文件。

    如果文件是通过挂钩加载的(例如,子程序引用,请参阅require 以了解这些挂钩的描述),默认情况下,此挂钩会插入到 %INC 中以代替文件名。但是请注意,该挂钩可能已自行设置 %INC 条目以提供一些更具体的信息。

    【讨论】:

      【解决方案4】:

      而()

      这会将@INC 中的路径连接到一个字符串中,用空格分隔,然后在字符串上调用 glob(),然后遍历空格分隔的组件(除非有文件通配元字符。)

      如果@INC 中的路径包含空格、\、[]、{}、*、? 或~,则此方法效果不佳, 似乎没有理由避免安全的替代方案:

      for (@INC)
      

      【讨论】:

        【解决方案5】:

        如果您想快速检查是否安装了模块(至少在 Unix 系统上,使用 Bash 作为 shell),请将其添加到您的 .bashrc 文件中:

        alias modver="perl -e\"eval qq{use \\\$ARGV[0];\\\\\\\$v=\\\\\\\$\\\${ARGV[0]}::VERSION;};\ print\\\$@?qq{No module found\\n}:\\\$v?qq{Version \\\$v\\n}:qq{Found.\\n};\"\$1"
        

        那么你可以:

        => modver XML::Simple
        No module found
        
        => modver DBI
        Version 1.607
        

        【讨论】:

        • 我喜欢这个。谢谢。
        • 这也适用于 Korn。但说真的,你需要一个爱好。
        【解决方案6】:

        又快又脏:

        $ perl -MXML::Simple -e 1
        

        【讨论】:

        • 虽然,如果你想要版本,大多数人会说“perl -MModule\ 999”。
        • 致匿名编辑:正确的方法是perl -MDigest::SHA -e 1 而不是perl -Digest::SHA -e 1
        • 我一直都用这个,虽然我通常用-e "print( \"got it\n\" )"
        • 这是我喜欢的:)。
        • 这个答案更适合在shell 函数中使用:if ! perl -M$module -e 1 2&gt;/dev/null; then
        【解决方案7】:

        如果您在 Windows 下运行 ActivePerl

        • C:\&gt;ppm query * 获取所有已安装模块的列表

        • C:\&gt;ppm query XML-Simple 检查是否安装了XML::Simple

        【讨论】:

          【解决方案8】:

          例如,要检查是否安装了 DBI 模块,请使用

          perl -e 'use DBI;'
          

          如果未安装,您将看到错误。 (来自http://www.linuxask.com

          【讨论】:

            【解决方案9】:

            我相信您的解决方案只会查看 @INC 数组中包含的每个目录路径的根目录。你需要一些递归的东西,比如:

             perl -e 'foreach (@INC) {
                print `find $_ -type f -name "*.pm"`;
             }'
            

            【讨论】:

              【解决方案10】:

              为@user80168 的解决方案喝彩(我仍在计算\ 的解决方案!),但要避免所有与别名和外壳有关的转义:

              %~/ cat ~/bin/perlmod
              perl -le'eval qq{require $ARGV[0]; } 
                  ? print ( "Found $ARGV[0] Version: ", eval "$ARGV[0]->VERSION" ) 
                  : print "Not installed" ' $1
              

              工作得相当好。

              这可能是最简单和最“现代”的方法,使用Module::Runtime

              perl -MModule::Runtime=use_module -E '
                   say "$ARGV[0] ", use_module($ARGV[0])->VERSION' DBI
              

              如果未安装模块,这将给出一个有用的错误。

              使用-MModule::Runtime需要安装(不是核心模块)。

              【讨论】:

                猜你喜欢
                • 2021-01-04
                • 2020-10-27
                • 2012-03-09
                • 2010-10-22
                • 1970-01-01
                • 2014-05-06
                • 2013-02-28
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多