出産前後の痔にはご注意!

まず環境です。

-----[os環境]----------------
windows xp sp2

-----[active perlバージョン]-
This is perl, v5.8.7 built for MSWin32-x86-multi-thread

-----[cpan環境]--------------
ppm> properties DBI
ppm> properties DBD-Pg
で結果表示あり(インストール済みと判断)

-----[PostgreSQLの環境]------
psql -U postgres -h localhost bookmark
ユーザ postgres のパスワード:postgres
ログイン可能でDB環境正常と判断。

の環境で、以下のスクリプトを実行すると、perlが強制終了します。
------[test.pl]--------
#! /usr/bin/perl
use DBI;

$dbname = "worple";
$user = "postgres";
$passwd = "postgres";
$host = "localhost";

#DBオープン
$db = DBI->connect("DBI:Pg:host=$host;dbname=$dbname", $user, $passwd) || die "DBI connect failed : $DBI::errstr";
#DBクローズ
$db->disconnect;

1;
----------------

エラーメッセージがでることもなく、googleでも似た症状を探せないでいます。
何かヒントや、参考のURLでもいいのでお教え下さい。
よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

> あれ?helpで確認したところ存在していますよ。



こちらのActivePerlは 5.8.8(Build819)ですが
「Unrecognized ppm command」となってしまいます。
PPMがGUIになったことで5.8.8からは廃止されたのかもしれません。
(helpにも見当たらないので)

> 「問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便をおかけして申し訳ありません。」

ひょっとするとDBD-Pgのコンパイル時に使われたVCランタイムまたは使用時に使われるOpenSSLのライブラリがないために異常終了しているかもしれません。
No2の回答にあるPgFoundryから
DBD-Pg-1.49-5.8s.tar.gz
を落として試してください。
なお、DBD-Pg-1.49-5.8.tar.gzにはOpenSSLのDLLが添付されていませんので[s]の付いている方で試してください。

> Windown環境では、シェバング(「#!」のこと)は意味を持たないので、何を書いても余り関係ないです。

CGIとして使用する場合は意味をもちます。(Windowsをサーバーとした場合でも)
サーバープログラム(例えばApache)がここを見てインタプリタに渡しますから。
なお、Apacheでもhttpd.confでScriptInterpreterSource Registryを使うと無視されます。
(レジストリを読んで関連付けされているもので実行されるため)
    • good
    • 0
この回答へのお礼

ありがとうございます!解決しました。
ならびに、guci-okさんもありがとうございます。

>こちらのActivePerlは 5.8.8(Build819)ですが
こちら、どうしてもパスに日本語を入れなければならなく、
どうやらPPM4ではパスにマルチバイト文字が入ると動かないバグが
あるらしく、PPM3である、5.8.7パックにしています。
PPMのバージョンも書けばよかったかな?

>No2の回答にあるPgFoundryから
>DBD-Pg-1.49-5.8s.tar.gz
>を落として試してください。

全てuninstallして、再度installしたのですが、
ほぼコレが解決の決め手でした。

OpenSSLのライブラリが無いのが原因なのか、5.8バージョンではなく5.6用
を入れてしまったのが原因か、今では解りません、、、、

私の様にへっぽこな人用にinstallの手順を書いておきます。
(http://pgfoundry.org/projects/dbdpgppm/
rep addしてしまう馬鹿も要るかもしれませんから。私の事です。笑)
-------
[1]ダウンロード
http://pgfoundry.org/projects/dbdpgppm/から
DBD-Pg-1.49-5.8s.tar.gz
DBD-Pg-5.8s.ppd
をダウンロードし、適当にフォルダを作り保存します。

[2]インストール
cd c:\xxxx
C:\xxxx>ppm install DBD-Pg-5.8s.ppd

できあがり。

お礼日時:2006/11/30 22:46

ActiveStateのサイトにDBD-Pgは無かったはずですが、


どこのサイトからインストールしましたか?
私の場合は、以下のサイトのものが動きました。

http://pgfoundry.org/projects/dbdpgppm/


> これはCPANではなくPPMですよね?
> ですがPPMにpropertiesというコマンドはなかったと思いますが何をされたのでしょうか?

このPCも、v5.8.7 なんですが、少なくともv5.8.7 のppmにはあるみたいですよ。


> もしくは1行目のパスが#! /usr/bin/perlだから。Windown環境ならPerlのパスが/から始まることはありえないので。例 #!C:/perl/bin/perl

Windown環境では、シェバング(「#!」のこと)は意味を持たないので、何を書いても余り関係ないです。
余りと書いたのは、余り自信がないので・・・
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>どこのサイトからインストールしましたか?
http://theoryx5.uwinnipeg.ca/ppms/
からインストールしました。
pgfoundryからインストールしなおしてみるのも手かもしれません。

>余りと書いたのは、余り自信がないので・・・
私も他のスクリプトでC:/の表記をしなかったので問題ないかなとおもって
とくに変更しませんでした。
ただ、もしもを考えて、C:/表記にして実行したのですが、やはり強制終了します。
他の方の回答にもかきましたが、強制終了はwindowsでアプリケーションが強制終了されたときにでるウインドウが表示されます。
「問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便をおかけして申し訳ありません。」との文句があります。

お礼日時:2006/11/28 23:32

> -----[cpan環境]--------------


> ppm> properties DBI
> ppm> properties DBD-Pg

これはCPANではなくPPMですよね?
ですがPPMにpropertiesというコマンドはなかったと思いますが何をされたのでしょうか?

> 以下のスクリプトを実行すると、perlが強制終了します。

このスクリプトはCGIとして動かされたのでしょうか?
そうなると、ブラウザに対して何かしら吐いてる内容がないのでそれでエラーになったのではないですか?(もしくは1行目のパスが#! /usr/bin/perlだから。Windown環境ならPerlのパスが/から始まることはありえないので。例 #!C:/perl/bin/perl)
(ちなみに「エラー」というのは500 Interneal Server Errorですか?)
サーバー(例 Apache)のエラーログを確認してください。

CGIではなく、スクリプトとして「perl test.pl」というようにcmd(コマンドプロンプト)から実行してエラーが出ない場合は普通にdisconnect後に何か出力しているわけではない($db->disconnect;の後が投稿された内容通りで何も記されていないなら)ので「それで正常終了」しているかもしれません。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>PPMにpropertiesというコマンドはなかったと思いますが
あれ?helpで確認したところ存在していますよ。

>このスクリプトはCGIとして動かされたのでしょうか?
環境書きもれすみません。コマンドから実行しています。

>何か出力しているわけではない
-----以下のように変更して実行しました。
#!C:/perl/bin/perl
use DBI;

$dbname = "worple";
$user = "postgres";
$passwd = "postgres";
$host = "localhost";

print "start";

#DBオープン
$db = DBI->connect("DBI:Pg:host=$host;dbname=$dbname", $user, $passwd) || die "DBI connect failed : $DBI::errstr";
print "dbopened";

#DBクローズ
$db->disconnect;
print "dbclosed";

1;
-----
やはり強制終了します。普通に終了するのではなく、
windowsでよくアプリケーションが強制終了される画面が表示されます。
「問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便をおかけして申し訳ありません。」
とうい文句のウインドウです。

お礼日時:2006/11/28 23:22

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q「Perl Command Line InterPreter」ってなんですか?

自分のPC内でPerlファイルを実行する為に、
ActivePerl 5.8.8 Build 819
httpd.exe
をインストールしています。


先週くらいまでは特に何ともなかったのですが、今日PC内を開いてみたら、
拡張子.plファイルのアイコンが「Perl Command Line InterPreter」に関連づけされていました。
関連付けはちょっとしたことでかわってしまうようなので、何かのキッカケでかわってしまったのかな、と思っておりますが。(自分では直接指定していません。)
また上記のアプリケーションはPerlを書く為のテキストエディタと認識しましたが、あっていますか?(普段はメモ帳で開いて編集しております。)
これは「ActivePerl」をインストールすると、一緒に入るものですか?
([スタート]-[プログラム]の中のActivePerlの中をみると、「Perl Package Manager」という名前の同じアイコンのものが存在しているようです。)

もともと.plファイルのアイコンは黄色い●だったと記憶していますが、これは何が関連付けされてこのアイコンになっていたのでしょうか?

最初はアイコンが変わっていたのに驚き、ウイルスか!?とびっくりしてしまいました。
これはそういう心配はないものでしょうか?

自分のPC内でPerlファイルを実行する為に、
ActivePerl 5.8.8 Build 819
httpd.exe
をインストールしています。


先週くらいまでは特に何ともなかったのですが、今日PC内を開いてみたら、
拡張子.plファイルのアイコンが「Perl Command Line InterPreter」に関連づけされていました。
関連付けはちょっとしたことでかわってしまうようなので、何かのキッカケでかわってしまったのかな、と思っておりますが。(自分では直接指定していません。)
また上記のアプリケーションはPerlを書く為のテキストエデ...続きを読む

Aベストアンサー

「Perl Command Line InterPreter」はperlを実行するためのプログラムで、
通常は
 <ActivePerlをインストールしたディレクトリ>\perl\bin\perl.exe
がそのプログラムです。

そもそもActivePerlをインストールする目的は、
このperl.exeを入れてperlプログラムを実行可能にすることです。
(実際にはperl.exe以外にも様々なファイルが動作に必要ですが。)

> 何かのキッカケでかわってしまったのかな、と思っておりますが
ActivePerlをインストールしたときでしょう。
perlプログラムには一般的に拡張子plが使われるのでperl.exeに関連づけされると思います。

> また上記のアプリケーションはPerlを書く為のテキストエディタと認識しましたが、あっていますか?
前述した通り、perlプログラムを実行するためのソフトウェアなので、
エディタではありません。

# インタープリタ(InterPreter)については参考URLを参照

参考URL:http://e-words.jp/w/E382A4E383B3E382BFE38397E383AAE382BF.html

「Perl Command Line InterPreter」はperlを実行するためのプログラムで、
通常は
 <ActivePerlをインストールしたディレクトリ>\perl\bin\perl.exe
がそのプログラムです。

そもそもActivePerlをインストールする目的は、
このperl.exeを入れてperlプログラムを実行可能にすることです。
(実際にはperl.exe以外にも様々なファイルが動作に必要ですが。)

> 何かのキッカケでかわってしまったのかな、と思っておりますが
ActivePerlをインストールしたときでしょう。
perlプログラムには一般的に拡...続きを読む

QPerlとWin32::ODBCを使ってDBにアクセスするときに出るエラー

こんばんわ。最近、Perlを使い始めたばかりの初心者です。解決方法がわからないので、教えて下さい。

PerlとWin32::ODBCを使ってDBにアクセスするプログラムを組んでいるます。DB接続まではうまくいくのですが、それ以降に以下のようなエラーがでます。モジュールが足りないようなのですが、どのようにして解決すればよいかわかりません。以下にエラーとコードを記入します。
コード:
#!/usr/local/bin/perl
$DSN = "DSN=DB1;UID=kaki388";
use Win32::ODBC;
if (!($0 = new Win32::ODBC($DSN))){
print Win32::ODBC::Error();
print "失敗";
exit();
}
print "成功";
$sql = "SELECT * FROM tbl1";
$0->run("$sql");
$0->sql("$sql");
@fn = $0->FieldNames();
while($0->FetchRow()){
undef %Data;
%Data = $0->DataHash();
print "$Data{$fn[$i]}<BR>\n";
}
$0->Close;

エラーコード:
2004/08/26(11:49:14) W-SV 127.0.0.1 [80] E200042 "Can't locate object method "run" via package "Win32::ODBC=HASH(0x275020)" (perhaps you forgot to load "Win32::ODBC=HASH(0x275020)"?) at odbc.cgi line 11.
"

よろしくお願い致します。

こんばんわ。最近、Perlを使い始めたばかりの初心者です。解決方法がわからないので、教えて下さい。

PerlとWin32::ODBCを使ってDBにアクセスするプログラムを組んでいるます。DB接続まではうまくいくのですが、それ以降に以下のようなエラーがでます。モジュールが足りないようなのですが、どのようにして解決すればよいかわかりません。以下にエラーとコードを記入します。
コード:
#!/usr/local/bin/perl
$DSN = "DSN=DB1;UID=kaki388";
use Win32::ODBC;
if (!($0 = new Win32::ODBC($DSN))){
prin...続きを読む

Aベストアンサー

まず、DB接続を保存している変数名が良くないです。
$0はグローバルな特殊変数(組込み変数)でスクリプトファイル名が格納されています。これに値を代入すると、UNIXなどではプロセスの表示が変わるようです。
$0や$!の様な特殊変数は通常の変数としては使えません。
DSNへのデータ接続のインスタンスを$0では無く、通常の変数に格納して下さい。(例えば、$connection など)

それから、perlでは、大文字と小文字を区別しますので、メソッド名などは大文字と小文字まで正確に記述する必要が有ります。
ですので「run("$sql")」「sql("$sql")」は「Run($sql)」「Sql($sql)」となります。

例 -----------------------------------------------
use Win32::ODBC;

$DSN = "DSN=DB1;UID=kaki388";

if (!($connection = new Win32::ODBC($DSN))){
print Win32::ODBC::Error();
print "失敗";
exit();
}

print "成功";
$sql = "SELECT * FROM tbl1";
$connection->Run($sql);
$connection->Sql($sql);
@fn = $connection->FieldNames();
while($connection->FetchRow()){
my %Data = $connection->DataHash();
print "$Data{$fn[0]}<BR>\n";
}
$connection->Close;
--------------------------------------------------

参考URL:http://member.nifty.ne.jp/hippo2000/perltips/win32odbc.htm

まず、DB接続を保存している変数名が良くないです。
$0はグローバルな特殊変数(組込み変数)でスクリプトファイル名が格納されています。これに値を代入すると、UNIXなどではプロセスの表示が変わるようです。
$0や$!の様な特殊変数は通常の変数としては使えません。
DSNへのデータ接続のインスタンスを$0では無く、通常の変数に格納して下さい。(例えば、$connection など)

それから、perlでは、大文字と小文字を区別しますので、メソッド名などは大文字と小文字まで正確に記述する必要が有ります。
ですの...続きを読む

QActivePerl付属のPPMでモジュールのインストールができない

今回ActivePerl 5.8.6.811を使いまして、PPMにてモジュールの追加を
行いましたが、うまくいきません。

具体的にはモジュールをインストールする際、
ppm> install time-hires
Error: No valid repositories:
Error: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
Error: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
となり、レポジトリーを疑ったところ、
ppm> rep
Repositories:
[1] ActiveState PPM2 Repository
[2] ActiveState Package Repository
ppm> rep describe 1
Warning: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
Describing Active Repository 1:
Name: ActiveState PPM2 Repository
Location:
http://ppm.ActiveState.com/cgibin/PPM/ppmserver-5.8-windows.pl?urn:/PPMServer
Type: unsupported
ppm> rep describe 2
Warning: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
Describing Active Repository 2:
Name: ActiveState Package Repository
Location:
http://ppm.ActiveState.com/PPM/ppmserver-5.8-windows.plex?urn:/PPM/Server/SQL
Type: unsupported
となってしまいます。また、ルーターのログから外部にアクセスした形跡もないようです。

調べていて、このような場合は「パスが通っていない」と言われますが、
今回のケースもパスが通っていないのでしょうか?
初心者であることは免罪符になるとは思っていませんが、
皆様のお力をお借りしたいです。

私の環境は
OS:win2000 Pro(SP4) CPU:Athron1.4G
使用ソフト:ActivePerl 5.8.6.811 PPM3.1(付属のもの)
です。長文で読みにくくて申し訳ありませんが、よろしくお願いしますm(_ _)m

今回ActivePerl 5.8.6.811を使いまして、PPMにてモジュールの追加を
行いましたが、うまくいきません。

具体的にはモジュールをインストールする際、
ppm> install time-hires
Error: No valid repositories:
Error: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
Error: 500 Can't connect to ppm.ActiveState.com:80 (connect: Unknown error)
となり、レポジトリーを疑ったところ、
ppm> rep
Repositories:
[1] ActiveState PPM2 Repository
[2] ActiveState Package Re...続きを読む

Aベストアンサー

オンラインインストールするとプロキシーなどの問題がありますが、
ローカルインストールに変えれば問題が解決します。

まず
http://ppm.activestate.com/PPMPackages/zips/8xx-builds-only/Windows/Time-HiRes-1.49.zip
をダウンロードして下さい。

ダウンロードしたモノを、ディレクトリ付きで展開して下さい。

展開先のディレクトリにhogehoge.ppdというのがあるので、そこをカレントディレクトリにして
ppm install hogehoge.ppd
とコマンド入力して下さい。

それでインストールできるはずです。


人気Q&Aランキング