6

我写了一个 Perl 脚本,我只是想把它发给每个人,因为我打算写一个 bash 脚本,用于测试用户的环境,并确定该环境是否能够运行 Perl 脚本。

我想测试以下内容:

  1. Perl 是否已安装在该系统中
  2. Perl 应该有版本 5 或更高版本
  3. 模块 JSON::Any 是否可用

任何建议将不胜感激:-)

4

3 回答 3

14

不,不要编写 shell 脚本。Perl 已经有一个非常好的方法来做到这一点。执行此操作的正确方法是使用普通工具链构建 CPAN-ready 发行版。其中一些在perlnewmodperlmodstyleperlmodinstall中进行了解释。

对于一个最小的工作示例,创建一个目录布局:

.
├── Build.PL
├── README
└── script
    └── abuscript.pl

Build.PL文件中,输入:

use 5.000;
use Module::Build qw();
Module::Build->new(
    module_name        => 'abuscript',
    dist_version       => '1.000',
    dist_author        => 'abubacker <abubacker@example.com>',
    dist_abstract      => 'describe what the script does in one sentence',
    configure_requires => {
        'perl' => '5.000',
    },
    requires           => {
        'JSON::Any' => 0,
    },
)->create_build_script;

更改详细信息以适合您的目的。

README文件中,放置一些安装说明,例如:

To install this module, run the following commands:

perl Build.PL
./Build install

一旦你完成了所有这些,你运行:

perl Build.PL
./Build manifest
./Build dist

这将产生一个.tar.gz您将分发的存档。告诉您的用户像安装任何其他 CPAN 模块一样安装它,或者如果他们不知道这意味着什么,他们应该阅读自述文件。

如果您有时间,我建议您将脚本转换为模块。pl2pm程序(Perl 附带)和 CPAN 模块Module-Starter-PBP可以帮助您。

如果许可证允许,可以将您的代码上传到 CPAN,以使您的用户更加方便。首先在以下任何地方寻求帮助:邮件列表module-authors@perl.org,网络论坛PerlMonks,IRC 频道 #toolchain on MagNET (irc://irc.perl.org/toolchain)

于 2010-04-09T10:35:15.343 回答
8

关于检查 Perl 可用性,最简单的方法是检查命令的返回码(退出码)perl -v,如果不是0,则说明您没有 Perl。

现在关于 Perl 要求,您应该从 Perl 脚本中处理它们:

#!/usr/bin/env perl
use 5.006_001;
use ModuleName 2.0;

上面的 Perl 代码只能在 perl 5.6.1 或更高版本以及 modele "ModuleName" 2.0 或更高版本上运行。无需从 bash 手动检查 Perl 版本,直接从 Perl 脚本中检查会更好、更容易。

参考:

于 2010-04-09T06:58:39.863 回答
2
if perl -MJSON::Any -e 'print "$JSON::Any::VERSION\n"' >/dev/null 2>&1
then : OK
else echo "Cannot find a perl with JSON::Any installed" 1>&2
     exit 1
fi

我经常使用 ' ${PERL:-perl}' 和类似的结构来识别命令(用于awkvsnawkgawk; troffvs groff; 等)。

如果要测试 JSON::Any 的版本,请改为捕获命令的输出。如果您想测试 Perl 的版本,请添加 ' use 5.008009;' 或您认为合理的任何数字。(就在不久前,他们终于从一个工作中的 NFS 挂载文件系统中删除了 Perl 4——但这不是机器上唯一的 Perl——至少,在过去十年或更长时间里不是这样!)

于 2010-04-09T07:00:54.653 回答