perlでCGIから次のCGIへ値を渡して開くには?

[上に] [前に] [次に]
さる 2000/06/06(火) 20:31:58
はじめまして。
今PerlでCGIを作っていますが、
open(SCRIPT,"c:/perl/bin/perl.exe Start.pl |");
のような文で次のプログラム(Start.pl)を開きたいのですが、その時
Start.pl?$data="A.html"
のような感じで、値を渡したいのですがそんな方法あるのでしょうか?
誰かご存知の方がいたら、教えて下さい。お願います。

sadahiro 2000/06/06(火) 22:59:10
仕切り直し (^^; しかしこれまた勘違いかも(わたしはwin98+ActivePerl522)。
exec.plの内容:
open(SCRIPT,"perl start.pl aaa |");

start.plの内容
open OUT, ">out.txt";
print OUT uc shift;

exec.plを実行すると、out.txtが作られ、その中にAAAと記される。
このことから、exec.plからaaaという値がstart.plに渡されて
実行されたことがわかる。

さる 2000/06/07(水) 09:49:37
sadahiroさんありがとうございます。上の説明はなんとなく理解できました。
さらにaaaの値をstart.plの中で変数にいれて使いたいのですが、このaaaはどこに入っているのですか?
素人な質問ですみません。

sadahiro 2000/06/07(水) 20:37:31
>このaaaはどこに入っているのですか?
これは変数ではなく、単に直においただけの文字列です。
$a="hogehoge12";
open(SCRIPT,"perl start.pl $a |");
のように変数にしてもいいです。""の中ですから。
もっとも、この場合パイプ( | のこと)をつかわずに、
`perl start.pl $a`;
とバックスラッシュを使って書いたほうがいいかと思います。

あと、perlからperlを呼び出すには、require または、use で
宣言することもできます(たぶんこのほうが便利かと)。

a.pl の中味
require 'start.pl';
start::print_uc("aaaa\n"); #呼び出し方その1。&start'print_uc("aaaa\n");と同じ 
$b="bbbb";
&start'print_uc($b);    #呼び出し方その2。start::print_uc($a); と同じ
#  & があったりなかったり…(たぶんふつうはどちらでもいいでしょう)

start.plの中味
package start;  #ライブラリ名の宣言、ふつうファイル名と同じにする習慣らしい。
sub print_uc {
open OUT, ">>out.txt";
print OUT uc shift;
}
1;  #1; を最後におく(一種のおまじない。最後に真の値が必要だから)

a.plを実行すると、out.txtにこう付け加わります。
AAAA
BBBB

ライブラリを作るには、package宣言と1;の間に適当に
サブルーチンとが変数とかいれれば他のプログラムから参照できるので、
よく使う関数(自作も当然可)はライブラリにいれると効率的です。
歌代作のjcode.plは大変よく使われますが、あれもライブラリの一つです。

sadahiro 2000/06/07(水) 20:39:50
>歌代作
歌代氏、作です。(書いたつもりが)
他意はありません。申し訳ありません。

sadahiro 2000/06/07(水) 20:46:00
説明不足
>さらにaaaの値をstart.plの中で変数にいれて使いたいのですが、このaaaはどこに入っているのですか?
これは、start.plの中ではshiftでとりだして受け取っています。
shift @ARGV; (メインプログラムで)
または shift @_ (サブルーチン内で)の引数を省略した形です。
$ARGV[0] とかあるいは $_[0] と書いてもいいのですが。
まあ、好みの問題です。

まさき 2000/06/08(木) 21:56:18
単純にファイルに保存しちゃって、次のcgiにLocationで飛ばすとか。
そこでファイル開き直して値をみる。
めんどくさいか。

こぐさ 2000/06/09(金) 10:52:24
まさきさんの方法でしたら、ファイルに保存しないでGETメソッドで送った方が早いですね。

print "Location: ./test.cgi?aaa=bbb&ccc=ddd\n\n";
あとはtest.cgi側でGETのデータとして取り込めば良いですね。
まぁ、こんな方法もあるよ…っていうだけです。

さる 2000/06/09(金) 14:26:17
sadahiroさん、まさきさん、こぐささん回答ありがとうございます。
sadahiroさんの#呼び出し方その2で出来ました。感激です。
最後にばかな質問で申し訳ないんですが、
&start'print_uc($b);
$bに続けて複数の変数を送るとき、何で区切ったらいいんですか?

Fuji.♪ [E-Mail] [HomePage] 2000/06/09(金) 14:43:57
print_ucに対して複数の引数を渡すだけ、ですよね?
それなら &start'print_uc($b, $c, $d) と渡したいだけ渡せばokです。
呼び出された start::print_uc 側で@_を正しく処理していれば。 (^^;

さる 2000/06/09(金) 16:02:01
start::print_uc 側で
local($b,$c,$d) = shift @_;
としているのですが、結果が
bbbb,,
となってしまうのですが・・・(?_?)

Fuji.♪ [E-Mail] [HomePage] 2000/06/09(金) 16:06:57
print OUT join(',', @_);
とかではどうでしょうか。

さる 2000/06/09(金) 16:23:03
ありがとうございます。out.txtには出力されました!
これを個々の変数に落としたいのですが、どうしたらいいのでしょう?(自分でも試してみたんですが)
立て続けですみません。

Fuji.♪ [E-Mail] [HomePage] 2000/06/09(金) 16:44:21
Perlの環境はあるのですよね?
Oerlのドキュメントを読むなりPerlの本を読むなりしましょう。
文字列操作の部分を見ればいくらでも例はあります。

Perl5 デスクトップリファレンス辺りだけでも手元にあるとかなり楽です。

while (<>) {
    @hoge = split(/,/);
}
とか。
local ($a, $b, $c) = split(/,/); でも可か。

さる 2000/06/09(金) 19:52:08
[[解決]]
Fuji.♪さん、ありがとうございました。
なんとか出来ました!
これに懲りずにまた何かあれば、よろしくお願いします。
私ももう少し勉強したいと思います。

さだひろ 2000/06/09(金) 20:49:04
どうもshiftで引っかかっているような(ちょっと不注意だったかしらん)。
shiftは配列の第一要素を取り出します。
@a = ("aaa","bbb","ccc"); に対して
$s_a = shift @a; とすれば、
$s_aには"aaa"が代入され、@aは("bbb","ccc")となります。

local @temp=@_;
または
local ($a,$b,$c)=@_;
のように書けばよろしいかと。

とりあえず、shiftのことはこの際忘れた方がいいかもしれません。

さる 2000/06/10(土) 13:53:14
[[解決]]
さだひろさん、追加ありがとうございました。
また一つ勉強になりました。

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