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 .) at try1.pl 行 3. BEGIN が失敗しました -- コンパイルは try1.pl 行 3 で中止されました。

ここで何が問題なのですか?..これを修正するには?.

ああ、ほとんど忘れていましたが、この Solaris ボックスでは何も変更/インストール/変更できません。このスクリプトは、Solaris 10 を実行している顧客に出荷する必要があります。したがって、彼にモジュールのインストールを依頼することは絶対にありません。:(

4

6 に答える 6

4

これは、 Perl5.10のコアであるTime:: Pieceで実行できるはずです(ここでの修正:5.8のコアではありません)。これが私のマシンの例です。man strftime、、man strptimeおよびを参照してくださいperldoc Time::PieceTime::Pieceドキュメントで、「日付の解析」セクションを確認します。(変換の詳細はSolarisマシンによって異なる場合があります。現在、OS Xを使用しています。)

#!/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はそれを認識していないようです)ので、2つのステップでこれを行う必要があるかもしれません。以下は私のために働きます:

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 に答える
4

エラー メッセージには、Perl ライブラリ インクルード パス ( @INC )でモジュール Date::Parse が見つからないことが示されています。

モジュールはCPAN (Comprehensive Perl Archive Network) から入手できます。ベース インストールに含まれていない Perl モジュールが必要な場合は、通常 (>90%)、事実上のPerl モジュール アーカイブ サイトである CPAN から入手できます。

あなたの質問は、CPAN モジュール (CPAN モジュールは CPAN からモジュールを取得するために使用されます) のドキュメントで解決されます。FAQの質問 5から始めることをお勧めします。

于 2009-04-07T15:50:23.907 に答える
3

モジュールをインストールしない顧客にプログラムを出荷する必要があるため、PAR :: Packerを使用して、すべての依存関係を含むネイティブ実行可能ファイルを作成する必要があります(またはコアモジュールのみを使用します)。

于 2009-04-07T17:07:27.967 に答える
3

それは正しいエラー メッセージでよろしいですか? Date::ParseはTime::ParseDateとは完全に別のモジュールです。これらは同様の機能を提供しますが、相互に使用しません。

Module::CoreListを使用して、5.8.8 に同梱されているモジュールのリストを取得できます。Solaris 10 に追加のモジュールが含まれているかどうかはわかりません。

適切なモジュールから内臓をコピーして、スクリプトに貼り付ける必要がある場合があります。(Perl ファイルには複数のpackageステートメントが含まれる場合があることに注意してください。)

于 2009-04-07T15:46:58.503 に答える
0

Solaris 10 はあまり好きではないようです。日付を受け入れてその日付のエポックを返す簡単なスクリプトを実行しようとしています

ばかげた質問ですが、入力された日付文字列のソースは何ですか? 文字列がシステムから取得される場合、コードはより単純になります。

于 2009-04-08T14:22:34.907 に答える
0

古いスレッドですが、これは同じ問題を抱えている人々を助けるかもしれません。標準の Time::Local モジュールで timelocal 関数を使用します。perlfaq 4を参照してください

于 2012-08-01T18:08:42.770 に答える