これからの季節に親子でハイキング! >>

Perl初心者です。
PerlでOracleに接続し、結果をCSVを出力したいのですが
下記プログラムだとなにも出力されません。
Oracle10g
OS:Linux
***

#!/user/bin/perl
#
#
# DBI モジュールの読み込み
use DBI;

#接続
my $hDb = DBI->connect("dbi:Oracle:dbname", "user/pass") or die "CONNECT ERROR $DBI::errstr";

#SELECT
#
$hSt = $hDb->prepare("SELECT ID,NAME FROM MASTER");
open(OUT, ">data.dat");
#実行
$nRes = $hSt->execute;

#データの取得
while($raRes = $hSt->fetchrow_arrayref) {
print OUT join(",", @$raRes), "\n";
}

# ファイルクローズ
close(OUT);
$hSt->finish;
$hDb->disconnect;

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

A 回答 (3件)

ANo.1です。



>書き込みオープンのチェックはどのようにしたらできるのでしょうか?

最初に確認しておけばよかったのですが「何も出力されない」というのはdata.datがサイズ0で作成されるのでしょうか?それともdata.datの作成がされないのでしょうか?open(OUT, ">data.dat"); でも返り値がfalseの場合、エラーメッセージを出力させてみてください(or dieでいいです)。
    • good
    • 0

> print join(",", @$raRes), "\n";


>とすると画面出力できているので出力に失敗していると思います。

とのことですけど、
>open(OUT, ">data.dat");
データベースへの接続はチェックしているのにこの書き込みオープンを
チェックしていませんが、本当に書き込みオープンできてますか?

この回答への補足

書き込みオープンのチェックはどのようにしたらできるのでしょうか?

補足日時:2008/05/27 22:05
    • good
    • 0

>下記プログラムだとなにも出力されません。



問題の切り分けが出来ていないと思います。

・DBからのデータ取得に失敗している
・CSVファイルの出力に失敗している

print OUT・・の直後に何か表示を追加するなりして、問題の切り分けをしてください。

この回答への補足

print OUT join(",", @$raRes), "\n";
の部分を、
print join(",", @$raRes), "\n";
とすると画面出力できているので出力に失敗していると思います。

補足日時:2008/05/26 20:05
    • good
    • 0

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

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

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

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

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QperlでHTMLを吐き出した画面をそのままHTMLファイルに変更する方法

perlでHTMLを吐き出した画面をそのままHTMLファイルに変更する方法を考えています。

どうしても良い方法がわかりません。
どのような方法が良いのか教えていただけないでしょうか?お願いします。

Aベストアンサー

こんばんは。

吐き出すと同時に同じ内容(HTML文)を新規ファイルに保存してしまえばよいですね。

例えば・・・

#!/usr/local/bin/perl

#吐き出す内容を$htmlに代入。
$html ="<html><body>\n<head><title>HTML保存</title></head>\nこんにちは</body>\n</html>\n";

#吐き出す
print "Content-type: text/html\n\n";
print "$html";

#newfile.htmlという新規ファイルを作成
open (NEWFILE,">newfile.html");

#新規ファイルに吐き出したのと同じ内容を書き込む
print NEWFILE $html;

#新規ファイルを閉じる
close (NEWFILE);

こんな風です。
ただし、この場合、newfile.htmlを保存するディレクトリ(フォルダ。上の例文ではこのcgiと同じディレクトリ)への書き込み権限がないとダメです。

こんばんは。

吐き出すと同時に同じ内容(HTML文)を新規ファイルに保存してしまえばよいですね。

例えば・・・

#!/usr/local/bin/perl

#吐き出す内容を$htmlに代入。
$html ="<html><body>\n<head><title>HTML保存</title></head>\nこんにちは</body>\n</html>\n";

#吐き出す
print "Content-type: text/html\n\n";
print "$html";

#newfile.htmlという新規ファイルを作成
open (NEWFILE,">newfile.html");

#新規ファイルに吐き出したのと同じ内容を書き込む
print NEWFILE $html;
...続きを読む

Q二次元配列における要素数のはじき出し

普通、配列の要素数を出すとき
$num = @list;
で良いですよね?
ですが、二次元配列で、
$num = @list[1];
って形にするとエラーになります。

どうすればいいのでしょうか?

Aベストアンサー

$num = @{$list[1]};
二次元配列は普通の配列に、配列のリファレンス(C言語で言うポインタのようなもの)が並んでいるものなので、これを解釈してやる必要があります。
$list[1]が配列のリファレンスとなっているので、@{$list[1]}としてやることで、配列の形に戻します。

QUTF-8のPerlから、UTF-8、EUC、Shift-jisの3つのエンコードテキストを生成

UTF-8で作ったPerl内で、UTF-8にエンコードしたい部分とは別に、
EUCやShift-jisにエンコードして、
UTF-8以外の仕様になっている検索エンジンなどの検索結果に、
テキストリンクを飛ばしたいのですが、行き詰まりました。
いい方法はありますでしょうか。

Aベストアンサー

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc , "\n";

use utf8;
use Encode;
use URI::Escape;

my $utf8String = 'テスト';

my $urf8BytesEsc = uri_escape(encode('utf8', $utf8String));
my $eucBytesEsc = uri_escape(encode('euc-jp', $utf8String));
my $sjisBytesEsc = uri_escape(encode('shiftjis', $utf8String));

print 'http://www.google.co.jp/search?hl=ja&q=' . $urf8BytesEsc ,"\n";
print 'http://dictionary.goo.ne.jp/search.php?MT=' . $eucBytesEsc , "\n";
print 'http://example.com/search.cgi?sjis=' . $sjisBytesEsc...続きを読む

Qperl system関数 引数 フォルダ

perlのsystem関数を使って、コマンドを実行したいのですが、
実行ファイルの引数にフォルダを指定すると、うまく動作しません。

以下のように書いています
system "実行ファイル フォルダ";

実行ファイルは .BATファイルで、
指定しているフォルダには複数のテキストファイルが入っています。
perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。
コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。
windous7でperlはActivePerlを使用しています。


引数にはフォルダを指定できないのでしょうか?
またフォルダを指定できない場合、解決策などはあるのでしょうか?

よろしくおねがいいたします。

Aベストアンサー

> しかしブラウザに
(略)
> が表示されてしまいます。

それは、バッチファイルが出力したものでしょう。
バッチファイルが出力したものも、CGIの出力に混ざってしまいます。
Perl側で対応する場合は、
system '… > nul'
としてください。
あるいは、バッチファイル側で、1行目に
@echo off
という行を追加してもいけるかと思います。

Qperlで容量の大きいCSVファイルを開く方法

perlで容量の大きいCSVファイルを開く方法


ファイル容量の大きいcsvファイルから、必要な項目を抜き出して別ファイルにするプログラムを作成したいと思ってます。
csvファイルが少ない場合は動作したのですが、容量が140MBを超えたデータを読み込もうとすると、ブラウザー表示で何も変化いたしません

プログラムは以下のようになってます。
-------------------------------------------------

open(IN,"$inport") || &error(" $inport を読み込みopen出来ません");
flock(IN,1);
@lines = <IN>;
foreach $lines (@lines) {
local(@val) = split("\,", $lines);
print "$val[0]";
$dat .= "$val[1]\,$val[5]\n";
}
open(OUT,">$dcsv");
flock(OUT,2);
print OUT "$dat";
close OUT;


-------------------------------------------------
件数も多いので、foreachを$lines (@lines) としないで($start .. $end)として読み込みの件数を制限して対応しようと考えてましたが、うまくいきませんでした。

ご指導いただけますと幸いです。

perlで容量の大きいCSVファイルを開く方法


ファイル容量の大きいcsvファイルから、必要な項目を抜き出して別ファイルにするプログラムを作成したいと思ってます。
csvファイルが少ない場合は動作したのですが、容量が140MBを超えたデータを読み込もうとすると、ブラウザー表示で何も変化いたしません

プログラムは以下のようになってます。
-------------------------------------------------

open(IN,"$inport") || &error(" $inport を読み込みopen出来ません");
flock(IN,1);
@lines = <IN>;
foreach $l...続きを読む

Aベストアンサー

質問者さんのコードは
> @lines = <IN>;
ここで、ファイルの全データを変数に読み込んで
> foreach $lines (@lines) {
これで、データを1つづつ取り出す

という処理になっていますので、「@lines=<IN>」の時点でメモリを大量に消費します。この2行の代わりに


> while ($lines = <IN>) {

とすれば、ファイルから1行ずつデータを読んで処理するようになりますので、
ファイルサイズが大きくても処理できるようになります。

ただし、そうやったとしても、
> $dat .= "$val[1]\,$val[5]\n";
この部分で変数 $dat のサイズがどんどん大きくなりますから、そちらの分のメモリ消費は入力ファイルサイズに比例します。

---

open(IN,"$inport") || &error(" $inport を読み込みopen出来ません");
flock(IN,1);

open(OUT,">$dcsv");
flock(OUT,2);

while ($lines = <IN>) {
local(@val) = split("\,", $lines);
print "$val[0]";
print OUT "$val[1]\,$val[5]\n";
}
close IN;
close OUT;
---
とすれば、完全に入力ファイルサイズに依存しないようになります。

質問者さんのコードは
> @lines = <IN>;
ここで、ファイルの全データを変数に読み込んで
> foreach $lines (@lines) {
これで、データを1つづつ取り出す

という処理になっていますので、「@lines=<IN>」の時点でメモリを大量に消費します。この2行の代わりに


> while ($lines = <IN>) {

とすれば、ファイルから1行ずつデータを読んで処理するようになりますので、
ファイルサイズが大きくても処理できるようになります。

ただし、そうやったとしても、
> $dat .= "$val[1]\,$val[5]\n";
この部分で変数 $dat ...続きを読む


人気Q&Aランキング