アプリ版:「スタンプのみでお礼する」機能のリリースについて

リモート側のファイル名を一括変更したのですが、正規表現の方法がわかりません。
現在は以下のとおり記述しています。

opendir(DIR, $FTPdir);
@FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR));
closedir(DIR);
if (@FTPlist){
foreach (@FTPlist) { rename /^$head$year$mon$mday.*\.csv$/,/^$head$year$mon$xday.*\.csv$/,);
print ;
print "\n";
}
}

A 回答 (7件)

#5のプログラムで


$ftpになっている部分を
$FTPに変更して下さい
($ftp->renameを$FTP->rename)
多分コレが#2のエラーの本質的原因です。
    • good
    • 0
この回答へのお礼

$FTPに修正したところ、renameできました。
ありがとうございます。

お礼日時:2005/01/14 10:06

#5>


補足のプログラムでは、リモートのファイルのリストを取っていません。
opendir(DIR, $FTPdir);
のファイル名は、ローカルですから
リモートとファイル名が一致していないのではないでしょうか?
リモートのファイルのリストは
$FTP->ls
でとってこないといけないと思います。
    • good
    • 0

リネームするのに使っている、スクリプトの全体を補足していただけませんか?


(ユーザ名とかパスワードは変更して)

この回答への補足

sub main{
$FTP = Net::FTP -> new($FTPserver) or die('Net::FTP失敗。終了します。');# FTP接続
if ($FTP) {
$FTP -> login($FTPuser, $FTPpass) or die('login失敗。終了します。');# ログイン
print "にログインしました。\n";
$FTP -> cwd($FTPdir) or die('cwd失敗。終了します。');# ディレクトリの変更
print "$FTPdirにディレクトリを変更しました。\n";
#システム日付の取得
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);#本番用
$year = 1900 + int($year);#本番用(年は1900マイナスで返ってくるため)
$mon = 1 + $mon;#本番用(月は0~11で返ってくるため1プラスする)
if ($mon < 10) { $mon = "0$mon"; }#一桁の月は頭に0をつける
if ($mday < 10) { $mday = "0$mday"; }#一桁の日は頭に0をつける
print "<システム日付:$year$mon$mday>\n";

#リストファイル画面出力
opendir(DIR, $FTPdir);
@FTPlist = grep (/^$head$year$mon$mday.*\.csv$/, readdir(DIR));
closedir(DIR);
if (@FTPlist){
foreach (@FTPlist)
{
$wk=$_;
$wk =~ s/^$head$year$mon$mday(.*)\.csv$/$head$year$mon$xday$1\.csv/;
$ftp -> rename($_,$wk);
print ;
print "\n";
}
}
$FTP -> quit or warn('初回quit失敗');# FTP切断
print "\n";
print "FTPを切断しました。\n";
}
close(MOUT);
}

補足日時:2005/01/13 12:05
    • good
    • 0

>上記の記述はしているのですが・・・。


そうですか…
こちらでも試しに
$ftp->rename(from,to);
してみましたが、問題なく動きました。
なので記述の問題ではないと思います。
Perlがインストールされているフォルダに
lib/Net/FTP.pm
というファイルがあると思うのですが、
その中に、
sub rename
というメソッドを定義している部分があるはずなのですが、これがありますか?
これがあるなら、
やはり、Ftpオブジェクトが正しく作られていないと思います。
今まで、ファイルの一覧とかゲットができているので、ちょっと考えにくいですが、何らかの原因で、接続できていないとかあるのかもしれません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。FTP.pmの中を確認しました。おっしゃるとおりsub renameという定義ありました。

接続も確認メッセージを出しながら実行しているので、できていると思うのですが。

renameの記述をコメントにすると正常に動作するようです。

お礼日時:2005/01/13 09:15

>下記エラーがでてうまくいきませんでした。


あのぅ
$ftp=Net::FTP->new("remoteHost");
から
$ftp->login("name","password");
みたいな(今までにもやってきた)ことは、当然やった上でのエラーがでるという話ですよね?
だとしたら変ですが、エラーメッセージからすると
Net::FTP->newとかされていないというようなことだと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。もちろん上記の記述はしているのですが・・・。

お礼日時:2005/01/12 16:54

ごめんなさい、勘違いしていました。


use Net::FTP;
を使って
$ftp->rename(FROM, TO);
つまり
rename の部分を

$ftp->rename($_, $wk);

に変えて下さい。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やってみたのですが、下記エラーがでてうまくいきませんでした。

Can't call method "rename" on an undefined value at ftprename.pl

use Net ::FTPは定義したのですが。

お礼日時:2005/01/12 16:13

試してないけど、多分以下のような感じでいいと思う。


foreach (@FTPlist) {
$wk=$_;
$wk =~ s/^$head$year$mon$mday(.*)\.csv$/$head$year$mon$xday$1\.csv/;
rename $_ , $wk;
print ;
print "\n";
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
できるようなのですが、この指定だとリモートではなくローカルをみにいくようです。

この場合、リモート、ローカル、それぞれのパスを指定してrenameするのはどのようにするのでしょうか?

お礼日時:2005/01/12 15:04

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