プロが教えるわが家の防犯対策術!

Perl 初心者です。

FTP接続時失敗時、接続先名をcsvに出力する(書き出す)プログラムを作成しております。
※複数FTPサーバがあり順番に接続していき、接続失敗したところをcsvに一覧にして出力したいです。もし、csvファイルがない場合、C:/logの下にERROR.csvを作成する必要もあります。

今現在、私が作成しているプログラムが以下になります。

#!C:/Perl/bin/perl

use Net::FTP;
use strict;

my $i;
my $j;

my @ftp_data = (
['ftp','192.168.0.0'],
['ftp2','192.168.0.10'],
);

sub error{
my $file = "ERROR.csv";

if(!-d"C:/log/$file"){
open(TFILE,"+>> $file") or die($!);
print OUT "$ftp_data[$i][0]";
close(TFILE);
}
else{
open(OUT, ">> $file"); # 追加オープン
print OUT "$ftp_data[$i][0]";
close(TFILE);
}
exit;
}

for ($i = 0; $i <= $#ftp_data; $i++){

#FTPサーバーへの接続
my $ftp = Net::FTP->new("$ftp_data[$i][1]")
or &error;
#ユーザー名とパスワードを指定してログイン
$ftp->login('user','password')
or die $ftp->message;

print "connect $ftp_data[$i][1]\n";

#接続終了
$ftp->quit;
}

実行してみると何もでないでずっとループ?しているみたいなのですが、
どこが悪いのかよく分からないのです。
ご教示いただけないでしょうか?

A 回答 (2件)

初心者とのことなので、とりあえず全部書いてしまいますが、業務で使うのであればちゃんとプロに依頼したほうがいいですよ。


SOHOサイトで依頼すれば3000円もかからないと思います。


#!C:/Perl/bin/perl
use Net::FTP;
use strict;

my @ftp_data = (
['ftp','192.168.0.0'],
['ftp2','192.168.0.10'],
);

for(@ftp_data){
# ftpで処理
eval{ &get_ftp(@$_) };

# エラーがあればログに記録
&error($@) if $@;
}

exit;


sub get_ftp {
my($label, $host) = @_;
$label = sprintf("%-8s", $label); # 整形

#FTPサーバーへの接続
my $ftp = Net::FTP->new($host) or die($label . $@);

#ユーザー名とパスワードを指定してログイン
$ftp->login('user','password') or die($label . $ftp->message);

print "connect $host\n";

#接続終了
$ftp->quit;
}

sub error {
my($message) = @_;
chomp($message);

open(OUT, ">> ERROR.csv") or die;
print(OUT "$message\n");
close(OUT);
}
    • good
    • 0
この回答へのお礼

本当にありがとうございます。
自分でevalを使う方法でやってもうまくいかなかったので参考になります。

ほとんど個人的な勉強なので実際に運用ということはしません。
ただ、業務的なプログラムの個人勉強です(汗)

お礼日時:2011/01/20 12:44

「実行してみると何もでないでずっとループ?しているみたい」とはどういうことなのでしょうか? 「ループしている」かどうかだけなら簡単にわかるはずですよね. 確かめたのですか?



少なくとも, サブルーチン error は明らかにおかしいです. -d で何をテストしているのか, オープンしているファイル名は正しいのか, ファイルハンドルはそれでいいのかなど, いくつも問題点が見つかります.

この回答への補足

恥ずかしながらループしているかの判断の仕方も良くわかっていません。
初心者の初心者で大変申し訳ありません。
コマンドプロンプトから実行した際、ファイル作成されるか printで「connect 接続先」表示のどちらか結果が出るはずですがどちらも出ないままなのでCtrl+Cで強制終了しています。

サブルーチンの使い方自体変ですよね・・・もう一度サブルーチン等の見直しをしてみます。

補足日時:2011/01/18 13:08
    • good
    • 0

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