system関数で変数を受け継ぐのは?

[上に] [前に] [次に]
やちゅん 2000/04/05(水) 08:34:22
=============test.pl================================
  open (IN,"data.txt");
    @name = <IN>;
  close (IN);

  foreach $name (@name){
    system ("ftp -s:ftpcmd.txt gc1fv188")
  }
====================================================

=======ftpcmd.txt===================================
admin
Master
cd /test/pdf
lcd ../pdf
put $name $name
bey
===================================================
と書いているのですが、当然test.plからftpcmd.txtに$name
は引き継げていないのでうまくいきません。
どうしたら$nameを渡せるのでしょうか?
あとこのプログラムだと$nameの数量分ftpcmd.txtを作成して
putコマンドが動くわけですがそれも一度で送ってしまいたいのですが
なにかいい方法はないでしょうか?
よろしくお願いします。

H&A 2000/04/05(水) 10:59:32
> どうしたら$nameを渡せるのでしょうか?

system() はシェルにコマンドを渡す関数です。シェルは Perl の変数など(コマンドライン引数と環境変数以外)は関知しないので、そのままでは $name を渡すことはできません。
また、

> system ("ftp -s:ftpcmd.txt gc1fv188")

上記では応答ファイルとして ftpcmd.txt を指定しておられるのですが、ftp は応答ファイル内の変数置換などは行わないので ftpcmd.txt の内容がそのまま使われてしまいます。

ご質問の場合は、ftpcmd.txt の内容をプログラム中で出力するのが一番よいのではないかと思います。

aaa 2000/04/05(水) 12:01:38
ftpに -s オプションってありますか?
自動転送するときは、.netrcに定義しないとダメでは?

H&A 2000/04/05(水) 12:11:43
> ftpに -s オプションってありますか?

Windows の ftp.exe では、"-s:filename" として filename を応答ファイルに使えるようです。
他にも、"-v" が「リモートサーバからの応答を表示しない」とかなっていたりします。

やちゅん 2000/04/05(水) 13:51:35
>ftpcmd.txt の内容をプログラム中で出力するのが一番よいのではないかと思います。

というのがよくわからないのですが、$nameがどれくらいの数、存在
するかどうかはその時々によって変わるのですが・・・。
"-s:filename"を使用せずにftpコマンドを書く方法も知らないので
お願いします。

H&A 2000/04/05(水) 14:01:35
> >ftpcmd.txt の内容をプログラム中で出力するのが一番よいのではないかと思います。
> というのがよくわからないのですが、$nameがどれくらいの数、存在
> するかどうかはその時々によって変わるのですが・・・。

open(OUT, "> ftpcmd.txt");
print OUT <<END_OF_DATA
admin
Master
cd /test/pdf
lcd ../pdf
END_OF_DATA
foreach $name (@name){
      print OUT "put $name\n";
}
print OUT "bye\n";
close(OUT);

とかでいいような気もしますが…試していないので、間違っているかも。

> "-s:filename"を使用せずにftpコマンドを書く方法も知らないので
> お願いします。

ftp コマンドの実装にもよりますが、"ftp < ファイル名" などとすればいけるかもしれません。

やちゅん 2000/04/05(水) 14:44:04
H&Aさん、ありがとうございます。
早速、試してみているのですが
>print OUT <<END_OF_DATA
のEND_OF_DATAのところでエラーになります。END_OF_DATA内はprint OUT
と同じなのかなぁ?と思って書いていたのですが・・・?

>ftp コマンドの実装にもよりますが、"ftp < ファイル名" などとすればいけるかもしれません。
Windows NTのヘルプを見たところ"s-:filename"はリダイレクション
(<) の代わりに、このスイッチを使ってください。
とありました。とすると-s:filenameを使わずにftpコマンドは書くこと
は無理なんでしょうか??

やちゅん 2000/04/05(水) 14:44:41
H&Aさん、ありがとうございます。
早速、試してみているのですが
>print OUT <<END_OF_DATA
のEND_OF_DATAのところでエラーになります。END_OF_DATA内はprint OUT
と同じなのかなぁ?と思って書いていたのですが・・・?

>ftp コマンドの実装にもよりますが、"ftp < ファイル名" などとすればいけるかもしれません。
Windows NTのヘルプを見たところ"s-:filename"はリダイレクション
(<) の代わりに、このスイッチを使ってください。
とありました。とすると-s:filenameを使わずにftpコマンドは書くこと
は無理なんでしょうか??

H&A 2000/04/05(水) 14:49:54
> >print OUT <<END_OF_DATA
> のEND_OF_DATAのところでエラーになります。

大ショック…
行末のセミコロン ";" が抜けていますね。ポカです。

> Windows NTのヘルプを見たところ"s-:filename"はリダイレクション
> (<) の代わりに、このスイッチを使ってください。
> とありました。とすると-s:filenameを使わずにftpコマンドは書くこと
> は無理なんでしょうか??

そうですね。
Windows では、標準入力が使えないようになっているものも多いみたいです。ftp.exe も使えないようなので、-s:filename を使用せざるを得ないと思います。

やちゅん 2000/04/05(水) 15:08:40
行末にセミコロンをつけたのですが、以下のようなエラーが出ます。
""でかこったりもしてみたんですが・・・H&Aさん、なんでなんでしょうか?
Can't find string terminator "END_OF_DATA" anywhere before EOF at D:\Users\inet\web\www\Cad\icad_extra\lib\infsys\renew\test.pl

いろいろ試してみてるのですが         print OUT "Admin \nMaster \ncd /test/pdf \nlcd ../pdf \n";
としたらうまく表示されているのですが
         print OUT "put $name$name ";
のところで$nameと$nameの間に改行が入ってしまうんです。
なぜなんでしょうか??
よろしくご指導ください。

H&A 2000/04/05(水) 15:15:30
> 行末にセミコロンをつけたのですが、以下のようなエラーが出ます。
> ""でかこったりもしてみたんですが

う〜ん、なんででしょう…?
こちら (FreeBSD 3.4-stable 上の perl 5.005_03) で試した限りではうまくいったのですが…

>          print OUT "put $name$name ";
> のところで$nameと$nameの間に改行が入ってしまうんです。

これは、元の $name に改行が入っているのでは。
$name 出力前に、

chomp($name);

とすると改行が削除されるかもしれません。

やちゅん 2000/04/05(水) 15:43:02
[[解決]]
いろいろありがとうございました。
>$name 出力前に、chomp($name);
の方を使わせてもらいました。
ちゃんと動いてるようなので完成ぃ!って感じです。

もう一方の方はなんでなのかは不明のままです。
perlのヴァージョンが低いのが問題なのでしょうか?
4.????くらいだったと思うのですが・・・。
H&Aさん。本当に長い時間おつきあいしてくださってありがとうございます。

Phine 2000/04/05(水) 16:09:15
Perl4 だと chomp は使えなかったような気がするんですけど、大丈夫ですか?

H&A 2000/04/05(水) 16:11:26
> Can't find string terminator "END_OF_DATA" anywhere before EOF at

ふと思ったのですが、終わりの "END_OF_DATA" のある行に空白等が入っているから…ということはないのでしょうか。

> Perl4 だと chomp は使えなかったような気がするんですけど、大丈夫ですか?

そうですよね。
改行コードが入っていることが明確なら、chop($name); のほうがいいかもしれません。

やちゅん 2000/04/05(水) 16:29:48
はい。chomp は使用せずに置換で
$name =~ s/\n//;
としておきました。

>終わりの "END_OF_DATA" のある行に空白等が入っているから…ということはないのでしょうか。
空白等は入れてないのですが、本当はバッチファイルで動かす予定なの
ですが動作確認の為ブラウザから確認しようとしたから?
そんな事ないですよね?今やってみたけどテキストファイルはできてなかったし。

[上に] [前に] [次に]