4

Solaris 10 似乎不太喜欢我。我正在尝试运行一个简单的脚本来接受日期并返回该日期的纪元:

#!/usr/bin/perl -w
use strict;
use Time::ParseDate;

my $date1 = "Mon Mar 27 05:54:08 CDT 2009";

#Convert to seconds since start of epoch
my $time1 = parsedate($date1);
print $time1;

在 RHEL 机器上工作得非常好,但在 Solaris(两者都有 5.8.8 Perl)上被搞砸了,给出了以下错误消息。

在@INC 中找不到 Date/Parse.pm(@INC 包含:/usr/perl5/5.8.4/lib/sun4-solaris-64int /usr/perl5/5.8.4/lib /usr/perl5/site_perl/ 5.8.4/sun4-solaris-64int /usr/perl5/site_perl/5.8.4 /usr/perl5/site_perl /usr/perl5/vendor_perl/5.8.4/sun4-solaris-64int /usr/perl5/vendor_perl/5.8。 4 /usr/perl5/vendor_perl .) 在 try1.pl 第 3 行。 BEGIN 失败 - 编译在 try1.pl 第 3 行中止。

这里有什么问题?...如何纠正这个?

哦..差点忘了,我不能在这个 Solaris 机器上更改/安装/修改任何东西,这个脚本需要发送给运行 Solaris 10 的客户!所以让他安装一个模块绝对不是一个选择。:(

4

6 回答 6

4

错误消息说它在您的 Perl 库包含路径 ( @INC )中找不到模块 Date::Parse 。

该模块可从CPAN (Comprehensive Perl Archive Network) 获得。如果您需要基本安装中未包含的 Perl 模块,通常 (>90%) 可从 CPAN (事实上的Perl 模块存档站点)获得。

您的问题已通过 CPAN 模块(CPAN 模块用于从 CPAN 检索模块)文档得到解决。我建议从常见问题 5 开始,“我不是 root,如何在个人目录中安装模块?”

于 2009-04-07T15:50:23.907 回答
4

你应该可以使用 Time::Piece 来做到这一点,它是 Perl 5.10的核心(这里更正:它不是 5.8 的核心)。这是我机器上的一个例子。见和。man strftime_ 在文档中,您要检查Date Parsing部分。(转换细节在 Solaris 机器上可能会有所不同。我现在在 OS X 上工作。)man strptimeperldoc Time::PieceTime::Piece

#!/usr/bin/env perl
use strict;
use warnings;
use Time::Piece;

my $date = Time::Piece->strptime("Tue Apr 7 12:46:59 2009",
  "%a %b %e %H:%M:%S %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";

编辑:CDT 上的解析器阻塞(%Z 似乎无法识别它),因此您可能需要分两步执行此操作。以下对我有用:

my $string = "Mon Mar 27 05:54:08 CDT 2009";
$string =~ s/CDT/-0500/; # Replace timezone with offset from UTC
my $date = Time::Piece->strptime($string, "%a %b %e %H:%M:%S %z %Y");
my $epoch_date = $date->epoch;

print "$epoch_date\n";

但是,现在我们遇到了 CDT => -0500 与 CST => -0600 的额外问题。我正式讨厌夏令时。

于 2009-04-07T16:53:38.267 回答
3

你确定这是正确的错误信息吗? Date::Parse是一个完全独立于Time::ParseDate的模块。它们提供类似的功能,但不相互使用。

您可以使用Module::CoreList获取 5.8.8 附带的模块列表。我不知道 Solaris 10 是否包含任何其他模块。

您可能必须从合适的模块中复制内容并将其粘贴到您的脚本中。(请记住,一个 Perl 文件可能有多个package语句。)

于 2009-04-07T15:46:58.503 回答
3

由于您需要将程序发送给不会为您安装模块的客户,因此您需要使用PAR::Packer创建包含所有依赖项(或仅使用核心模块)的本机可执行文件。

于 2009-04-07T17:07:27.967 回答
0

Solaris 10 似乎不太喜欢我。我正在尝试运行一个简单的脚本来接受日期并返回该日期的纪元

愚蠢的问题,但是输入日期字符串的来源是什么?如果字符串是从系统中获取的,那么您的代码会简单得多。

于 2009-04-08T14:22:34.907 回答
0

旧线程,但这可能会帮助有同样问题的人。使用标准 Time::Local 模块中的 timelocal 函数。见 perlfaq 4

于 2012-08-01T18:08:42.770 回答