如何从终端 运行 Mac 上的这个简单的 Perl CGI 脚本?

How to run this simple Perl CGI script on Mac from terminal?

这个简单的 .pl 脚本应该抓取一个目录中的所有图像并输出一个 HTML - 当在浏览器中打开时 - 在他们的位置显示该目录中的所有图像自然尺寸。

从 mac 命令行,我只想说 perl myscript.pl 并得到它 运行。

…它曾经在 /cgi-bin.

中在 apache 上 运行
#!/usr/bin/perl -wT
# myscript.pl

use strict;
use CGI;
use Image::Size;

my $q = new CGI;

my $imageDir = "./";
my @images;

opendir DIR, "$imageDir" or die "Can't open $imageDir $!";
    @images = grep { /\.(?:png|gif|jpg)$/i } readdir DIR;
closedir DIR;

print $q->header("text/html"),
      $q->start_html("Images in $imageDir"),
      $q->p("Here are all the images in $imageDir");

foreach my $image (@images) {
    my ($width, $height) = imgsize("$image");
    print $q->p(
            $q->a({-href=>$image},
              $q->img({-src=>$image,
                       -width=>$width,
                       -height=>$height})
            )
    );
}

print $q->end_html;

Perl 曾经在标准库中包含 CGI 模块,但在 v5.22 中被删除(参见 The Long Death of CGI.pm)。许多旧代码假定它会一直存在,但现在您必须自己安装它:

$ cpan CGI

Perl 曾经在标准库中包含 CGI 模块,但在 v5.22 中被删除了。许多旧代码假定它会一直存在,但现在您必须自己安装它。

Perl 附带的 corelist 程序可以方便地检查这些东西:

$ corelist CGI

Data for 2020-03-07
CGI was first released with perl 5.004, deprecated (will be CPAN-only) in v5.19.7 and removed from v5.21.0

我使用 extract_modules program from my Module::Extract::Use 模块来处理这类事情。否则,我最终会安装一个模块,然后再次 运行 并发现另一个要安装的模块,依此类推:

$ extract_modules some_script.pl | xargs cpan

模块编写者还有一个有趣的地方。长期以来,我们只会在 Makefile.PL 中列出外部先决条件。既然 Perl 有将模块踢出标准库的先例,您甚至应该列出内部模块。除此之外,为您实际使用的任何模块指定一个依赖项,而不是依赖它在特定的分布中。

而且,我经常移动遗留程序,以至于我编写了一个小工具,scriptdist 来将模块基础结构包装在单文件程序周围,这样我就可以将它们作为模块安装。最大的好处是 cpan 和类似的工具会为您安装先决条件。我已经很长时间没有使用它了,因为我现在只是将程序作为常规 Perl 发行版启动。