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;
}
実行してみると何もでないでずっとループ?しているみたいなのですが、
どこが悪いのかよく分からないのです。
ご教示いただけないでしょうか?
No.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);
}
本当にありがとうございます。
自分でevalを使う方法でやってもうまくいかなかったので参考になります。
ほとんど個人的な勉強なので実際に運用ということはしません。
ただ、業務的なプログラムの個人勉強です(汗)
No.1
- 回答日時:
「実行してみると何もでないでずっとループ?しているみたい」とはどういうことなのでしょうか? 「ループしている」かどうかだけなら簡単にわかるはずですよね. 確かめたのですか?
少なくとも, サブルーチン error は明らかにおかしいです. -d で何をテストしているのか, オープンしているファイル名は正しいのか, ファイルハンドルはそれでいいのかなど, いくつも問題点が見つかります.
この回答への補足
恥ずかしながらループしているかの判断の仕方も良くわかっていません。
初心者の初心者で大変申し訳ありません。
コマンドプロンプトから実行した際、ファイル作成されるか printで「connect 接続先」表示のどちらか結果が出るはずですがどちらも出ないままなのでCtrl+Cで強制終了しています。
サブルーチンの使い方自体変ですよね・・・もう一度サブルーチン等の見直しをしてみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- プロバイダー・ISP hpb22の接続方法の変更 1 2023/08/06 18:47
- サーバー FTPサーバについて詳しい方(アクセス権のないディレクトリを非表示にする方法) 4 2022/08/22 22:33
- その他(インターネット接続・インフラ) 楽天ひかりでホームページアップロードが出来ない 1 2022/07/30 10:02
- ドメイン・サーバー・クラウドサービス FileZillaを使用してwpXサーバーに接続できない 2 2022/03/29 21:02
- サーバー Googleドライブなどを使わずにテザリングAndroidでWindowsとファイル共有 1 2023/02/19 13:14
- ASP・SaaS サーバーログイン情報とFTP接続情報の見つけ方を教えてください。 3 2023/07/24 16:19
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- サーバー ECサイトのFTPサーバーに使わないファイル20GBくらいがあるのですが、削除したら表示速度やページ 2 2022/12/20 08:45
- サーバー NASの利用経験多い方教えてください! 1 2022/03/24 19:21
- サーバー Laravelをレンタルサーバーにインストールするにはどうすればいいですか? 2 2022/06/29 10:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
Perlで空白行を削除
-
バッチファイルの作り方(CSV→...
-
MATLAB グローバル変数の宣言
-
VBAでCSVファイルの特定行を書...
-
ExcelをCSV書き出す場合のシー...
-
fopenでディレクトリ内の全ファ...
-
Perlで特定文字列から特定文字...
-
vba dir の相対パス
-
awkスクリプトでダブルクォーテ...
-
C言語のバイナリモードでのfsca...
-
chdirがうまくできない
-
batファイルでrenameができませ...
-
VBAで巨大なファイルの途中から...
-
openした後、closeしないでプロ...
-
ファイル全てを .xlsm に変更し...
-
DOSコマンドで、標準出力を出力...
-
Perl utf8上でshiftjisをデコード
-
perlで容量の大きいCSVファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Perlで特定行から特定行までを...
-
perlでcsvファイルを読む(ダブ...
-
BBCode削除&改行をサニタイジ...
-
Perlで空白行を削除
-
Perlの初心者です。2重ループ...
-
MATLAB std::exceptionエラー
-
ファイルの3行目までを出力したい
-
perlでファイルの比較
-
pythonでの実績データの処理プ...
-
cgiのログの書き方
-
先頭の単語が一致した時のデー...
-
書き込み時に勝手にクリアさせ...
-
エラーチェック、ファイルに特...
-
Argument "\\\\n" isn't numeri...
-
CSVファイルのデータの行数を取...
-
perl:パターンマッチを使ったif...
-
Pythonでegrep機能をつかいたい
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
VBAでCSVファイルの特定行を書...
おすすめ情報