【Perl】初心者コーナー Part18
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
02/11/20 22:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 8
http://pc.2ch.net/test/read.cgi/php/1032704121/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
過去ログ、その他の役立ち情報は>>2-10あたりを見よう。
0655nobodyさん
02/12/23 16:01ID:???0656nobodyさん
02/12/23 16:19ID:3KeBindS今までずっとcount.cgiとかでそのままHTMLに数値を出力していたのですが、
<img>タグで呼び出すにはどうするんでしょうか?
count.cgiと呼び出すカウンターの違いはなんなんでしょうか?
どうかご教授お願いします。
0657nobodyさん
02/12/23 16:51ID:mDd0PRmu今までのcount.cgiは「文字」を返す。
画像の場合は、<img src="img_count.cgi">で呼び出す。
img_count.cgiは、画像(の中身)を返すCGI。(readしてprint)
こうすれば、ブラウザがHTMLを読んだ後に画像としてimg_count.cgiを取りに行く。
0658nobodyさん
02/12/23 17:31ID:???foreach(split(/&/,$i)){
/=/;
$in{$`} = $';
}
read(STDIN,$i,$ENV{CONTENT_LENGTH});
foreach(split(/&/,$i)){(
$key,$val) = split(/=/,$_);
$in{$key} = $val;
}
どちらが効率が良いでしょうか。
あんまり変わりません?
0659nobodyさん
02/12/23 19:16ID:???ヒントだけでもいいのでお願いします。
0660nobodyさん
02/12/23 19:25ID:???foreach(配列){
if(/xxx/でマッチしたら){その行を削除}
}
0661nobodyさん
02/12/23 20:14ID:???レスありがとうございます。
ループを使ってマッチしたら、その行を削除というのは分かるのですが、「その行を削除」の所が分からないんです・・・
while(@配列){
if($_ =! /zzz/){
push (@新しい配列,$_);
}
}
@配列 = @新しい配列;
こんな感じでしか思い付かないのですが、何かいい方法お願いします。
0662nobodyさん
02/12/23 20:30ID:???0663nobodyさん
02/12/23 20:43ID:???perl -w -e '%s = (a , 1); print $s{a};'
perl -w -e '%s = (a => 1); print $s{a};'
0664641
02/12/23 20:50ID:???そのように外部プロセスと通信するのですか。
手持ちのWindows環境だと、'-|'は(forkを使っているみたいなので)
動きませんが、UNIX環境で試した所、見事に動いてくれました。
それと調べた所、IPC::Open2という標準モジュールでも
外部プロセスとの通信ができるようで、こちらを使うことにしました。
わざわざサンプルコードまで付けて頂き、ありがとうございました。
謎が一つ解けました。。
0665nobodyさん
02/12/23 20:51ID:???それで悪い理由は何?
=!の部分がわけわからんけど。
0666nobodyさん
02/12/23 20:54ID:???速度を軽視するのは良くないが、だからと言って、自分に不相応な高速化に挑んで安定性や保守性がなくなっては意味がない。
高速化のコードを教えられても、自分で保守しきれないと思ったら、自分でわかるやり方に戻すのも利口な人間の判断だよ。
プログラミングはタイムトライアルじゃないんだから。
0667nobodyさん
02/12/23 21:11ID:???0668659
02/12/23 22:00ID:???ありがとうございます。
その方が僕のよりかなり良さげですね。
>665
=!じゃなくて!=でした。
何か配列を無駄に出し入れしている気がしたので。
0669nobodyさん
02/12/23 22:08ID:???0670nobodyさん
02/12/23 22:40ID:ty3RFcqjその選択した結果をb.cgiに送りb.cgiで結果を表示、ファイルに書き込み
をするということができています。
これをa.cgiで選択したものをa.cgiに送り表示、ファイルに書き込みさせたいのですが
どうやらhiddenという、コマンドをもちいて
1回目と2回目のページの閲覧を場合わけすればできるみたいなんですが
どうやればいいのですか?
<INPUT type="hidden" name="action" value="write">
こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
0671nobodyさん
02/12/23 22:44ID:ExE7e9sR0672nobodyさん
02/12/23 23:12ID:???> <INPUT type="hidden" name="action" value="write">
> こんなのを送信ボタンと一緒につけてやるみたいなんですが…。
書き込みフォームのなかにこれを入れておくと、CGI側では他のフォームと同じように
$in{action} という感じで値が取り出せる。(この場合、中身はもちろん write)
ただ単にCGIが呼ばれただけだと $in{action} の中身は空。
これをCGIの冒頭で判断して、表示だけするなり書き込みするなり処理を行う。
ちなみに"action"と"value"の部分は、他の name の中身と重複しなければ
好きな文字列でいいよ。
0673nobodyさん
02/12/23 23:14ID:/nqoyrjh0675670
02/12/24 01:03ID:o+cSQN2k$in=$form{action};
if($in eq "write"){
&write_file;
}
<FORM METHOD="POST" ACTION="a.cgi">
<INPUT TYPE="submit" VALUE="実行">
<INPUT TYPE="hidden" name="action" value="write">
こんな感じでやれば、ただページを閲覧した1回目の時は何もしないで
フォームを選択した2回目のときはifの中の&wite_fileを実行するってことでよいですか?
0676nobodyさん
02/12/24 01:32ID:???微妙に甘い。それではwriteがあった場合、
write_fileが実行されるが、その後で本来の表示もされる。
if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
exit;
この方がよかないか?
0677670=675
02/12/24 01:57ID:o+cSQN2kread(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
$cgi_url = './hid.cgi';
$in=$form{action};
if ( $in eq 'write' ) {
&write_file;
} else {
&read_file:
}
print "Content-type: text/html\n\n";
print <<"END";
<FORM METHOD="POST" ACTION="$cgi_url">
<tr><td align=right>選択<br></TD><td align=left>
<select name="box"><option><option value="1">yes<option value="0">no</select></td></tr><br>
<INPUT TYPE="submit" VALUE="実行">
<INPUT TYPE="hidden" name="action" value="write">
END
sub write_file{print "2回目ですね<br>";}
sub read_file{print "1回目ですね<br>";}
exit;
これだとできないんですけどなぜですか?
0678nobodyさん
02/12/24 02:03ID:???>2:それでこんな風にやってみたが・・・
>3:それだとこんなエラーが出て上手く行かなかった。
>
>1と3が無いと誰も答えられないよ。
>良い回答は良い質問から。一緒に勉強しましょう。
0679nobodyさん
02/12/24 02:28ID:???HTTPヘッダ吐く前にprintしたらいかんだろう。
print "Content-Type: text/html\n\n";
をif の前に置く。
0680nobodyさん
02/12/24 10:42ID:???アホを怒ったりはしないが自分で努力せずに「聞きゃいいや」って考え方に
教える気力を奪われる
>>589 はどういう場合に実行されるか考えれば貴方にとって必要か不必要か
判るはず。アホを自慢せずに自力で考えましょう
0681nobodyさん
02/12/24 16:14ID:V710Vuw6rindexって便利そうなのですが、
1バイトずつ戻ってくれるのでしょうか。
頭から調べなおすのでしょうか。
0682nobodyさん
02/12/24 21:26ID:0ZCnncs6eval "use $module";
と書いてみました。
しかし、useとevalでぐぐってみてもヒットしません。
不安なので、ベターな方法を教えてください。
0684nobodyさん
02/12/25 00:41ID:???use Module LIST
use Module
Imports some semantics into the current package from the named module,
generally by aliasing certain subroutine or variable names into your package.
It is exactly equivalent to
BEGIN { require Module; import Module LIST; }
0685nobodyさん
02/12/26 02:12ID:wZ43brtnっていうのは使えませんかねぇ。
0686685
02/12/26 02:53ID:wZ43brtn実は685を書き込むまで参照を知りませんでした。
cのポインタみたいに理解しているのが間違いなのだろうか…?
$i = 774;
$ip = \$i;
$$ip++;
if( fork() ){
while(1){
print "親:$$ip\n";
$$ip++;
sleep(2);
}
}else{
sleep(1);
while(1){
print "子:$$ip\n";
sleep(2);
}
}
0687nobodyさん
02/12/26 02:55ID:WbFeNueP$abc = "a&b&c";
@pairs = split (/&/, $abc);
↑このような場合に、@pairs から $abc を作り直したいのですが・・・
私では、@pairs の要素数を求めてから、$abc_2 = "$pairs[0]&$pairs[1]&$pairs[2]&・・・"; のようにやっていく方針しか立てられないのです・・・
うまいことやる方法があったら、教えてください。
0689687
02/12/26 03:11ID:WbFeNuePごめんなさい・・・本当にありがとうございました・・・
0690nobodyさん
02/12/26 04:56ID:???Image::Magick の利用で困っているので教えてください。
img.pl というファイルを実行すると下記のエラーがでます。
---
Can't load '/usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/Magick.so' for module Imag
e::Magick: cannot open shared object file: cannot load shared object file: No such file or d
irectory at /usr/lib/perl5/i386-linux/DynaLoader.pm line 206.
at img.cgi line 4
Compilation failed in require at img.cgi line 4.
BEGIN failed--compilation aborted at img.cgi line 4.
---
一応CUI上でImageMagick は利用可能で、
Perldoc Image::Magic でもマニュアルが見れてます。
Image::Magick をインストールするとデフォルトで
PerlMagickがインストールされるみたいですが、一応再度PerlMagickをインストールしてみたところ、
make test で下記のエラーを見つけました。
---
make: *** [test_dynamic] Error 2
なにか対処法があれば教えてください。
当方の環境
Linux Slackware 8.0
Perl 5.6.1
Image::Magick 5.5.3
0691nobodyさん
02/12/26 04:57ID:???---
#!/usr/bin/perl
use lib('/usr/local/lib/site_perl/5.6.0/i386-linux');
use Image::Magick;
$ImageFile = './test.jpg';
$ImageFile2= './test2.jpg';
$i = Image::Magick->new(size=>'320x240');
$x = $i->Read($ImageFile) ;warn "$x" if "$x";
$x = $i->Magnify() ;warn "$x" if "$x"; # 画像を縦横2倍に拡大
$x = $i->Write($ImageFile2);warn "$x" if "$x";
undef $i;
print "Content-type: text/html\n\n";
print "<html><a href=\"../imgtest/test.jpg\">使用前</a><br><a href=\"../imgtest/test2.jpg\">
使用後</a></html>\n";
exit;
0692nobodyさん
02/12/26 04:59ID:???1 img.pl ではなく .cgi の間違いでした。
2 img.cgi の 4行目は use Image::Magick; になってます。
一度に投稿できなかったので分けて投稿しました。
板汚しですいません。
0693nobodyさん
02/12/26 05:15ID:???vi /etc/ld.so.conf で /usr/lib/perl5/site_perl/i386-linux/auto/Image/Magick/ を追加したら
正常動作しました。
ImageMagickってこういうものなんでしょうか?^^;
0694nobodyさん
02/12/26 11:23ID:DQIeVDZ8ただCGIでHTMLを読み込んで表示させたいのですがどうすればよいでつか?
本当にただindex.htmを外から読み込んでそのまま表示させるだけです。
0695nobodyさん
02/12/26 11:37ID:???index.htmをファイルオープンして読み込んで表示するだけだが、
本当にそれしかしないなら、直接index.htmを表示しなさい。
0696nobodyさん
02/12/26 11:48ID:???index.htmlを読み込んで出力するまえに
適切なヘッダも出力しなきゃだめよ。
Content-Type: text/html
とか
0698nobodyさん
02/12/26 18:04ID:???処理するところは書けたのですが、「一定時刻に」というところでつまづいています。
0699nobodyさん
02/12/26 18:04ID:jnr3kh76sub G{
my $a=shift;
if($a>0){
G($a-1);
print"$a\n";
G($a-1);
}print" \#$a\n";
}
この処理の流れが良く理解できません
アドバイスなどお願いします
0700nobodyさん
02/12/26 18:14ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
0703nobodyさん
02/12/26 19:00ID:???ありがちな方法なら、「最後のアクセスと時間帯が違えば処理をする」という方法。
1時間に1回の方法なら、最後にアクセスした時の「時間(11時とか)」を保存しておき、
「前回の時間と違ったら(11時じゃなくなったら)処理をする」などでやる。
ただし、1時間以上アクセスがなかったら困ったりする事もある。
あと、鯖がかなり限られるがcronもある。
これはスレ違いだから自分で検索すれ。
0706nobodyさん
02/12/27 00:12ID:BkvjWsIwmod_perl を入れるために、use strict をしておこうと思ったんですが、
$| = 1;
$ENV{いろんな環境変数};
こういうのも my しないとだめなの?
0708nobodyさん
02/12/27 00:54ID:qm28R9Zoフュージョン料金明細で必須項目をテキストにあらかじめ記入しておいて
それと現在の日時をもとに一発で明細結果がでるようする方法はあるでしょうか?
いちいち項目をコピペするのが面倒なんです。
0709706
02/12/27 01:30ID:BkvjWsIw例えば、
sample.cgi というCGIプログラムがあったとして
use strict;
$| = 1;
require './common.pl';
としていたとしよう。このとき、common.pl にも use strict は書くべきなのか。
それとも、sample.cgi の use strict を引き継いで、
common.pl には、何も書かなくても自動的に use strict されるのか?
0710nobodyさん
02/12/27 01:33ID:???0711699
02/12/27 01:36ID:BtYEwdxr途中からよ〜分かりません
どこで値が保持されどの様に順番に吐き出されるのか?
0712nobodyさん
02/12/27 01:37ID:???パッケージならパッケージ変数になってるし、
use strict; しなくてもそのスクリプト内でしか使わないなら、my とかしとけばいいだけじゃない?
>common.pl には、何も書かなくても自動的に use strict されるのか?
no!
0713nobodyさん
02/12/27 02:31ID:???sub G{
>>699
実行してみて。
これでわかる?
G(3);
sub G{
my $a=shift(@_);
my($space) = "";
for(my($i)=$a; $i<3; $i++){$space .= " ";}
print "$spaceここからG($a){\n";
if($a>0){
G($a-1);
print"$space$a\n";
G($a-1);
}
print"$space\#$a\n";
print "$space}ここまでG($a)\n";
}
0715nobodyさん
02/12/27 10:20ID:???その通り、常に実行ですね
>>703
で出てる様にcronを使う手がありますがユーザーに開放している鯖はかなり少な
いし、perl(スクリプト)での質問でしたので>>701としておきました
笑える手として、webサーバーがあるならhtmlより定期的に呼び出すとかもあるけ
ど、これもスレ違い
0717nobodyさん
02/12/27 20:28ID:pRxcckDoご存知の方がいらっしゃいましたら、是非教えてくださいまそ。
0718nobodyさん
02/12/27 20:35ID:yQoOgQCT0721nobodyさん
02/12/28 01:10ID:???foreach(keys %HASH){
・・・
}
に相当する処理ってできないんでしょうか?
できるのならやり方教えてホスイ。
0723nobodyさん
02/12/28 01:39ID:???for (keys %$ref){
print $_,"\n";
}
0724りゅう
02/12/28 12:37ID:7mOI1Cp3その本に付属していたCDのサンプルをLocalhostに置くと動くんですが、
自分で真似て作ったやつだと、エラーが出てしまいます。何回も見なおしたけど
違いが分かりません。どなたか違っている個所を教えてくれるとありがたいです。
0725りゅう
02/12/28 12:38ID:7mOI1Cp3#!/usr/local/bin/perl
#==========================================================
#メイン処理
#==========================================================
#ヘッダを表示する
&print_header;
#トップを表示する
&print_top;
#==========================================================
#ヘッダの表示
#==========================================================
sub print_header {
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}
0726りゅう
02/12/28 12:39ID:7mOI1Cp3# 入力画面の表示
#==========================================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://></td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=massage wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}
_END_
0727りゅう
02/12/28 12:40ID:7mOI1Cp3#!/usr/local/bin/perl
#=========================================
#メイン処理
#=========================================
#ヘッダを表示する
&print_header;
#トップを表示する
&print_top;
#=========================================
# ヘッダの表示
#=========================================
sub print_header {
print "Content-type: text/html\n\n";
print "<META HTTP-EQUIV=Content-Type CONTENT=\"text/html; CHARSET=Shift_JIS\">";
print "<html>\n";
print "<head><title>Simple BBS</title></head>\n";
print "<body bgcolor=#fffff0 text=#000000 >\n";
}
0728りゅう
02/12/28 12:41ID:7mOI1Cp3# 入力画面の表示
#=========================================
sub print_top {
print "<center><table width=600><tr><td>\n";
print "<br><br><center><h2>Simple BBS</h2>\n";
print "<hr> [ <a href=http://www.marutora.net>Back To Homepage</a> ] <hr></center>\n";
print "<form method=post action=bbs1.cgi>\n";
print "<input type=hidden size=20 name=action value=regist>\n";
print "<table border=0>\n";
print "<tr><td align=right>名前 :</td><td><input type=text size=20 name=name></td></tr>\n";
print "<tr><td align=right>E-mail:</td><td><input type=text size=40 name=mail></td></tr>\n";
print "<tr><td align=right>URL :</td><td><input type=text size=40 name=url value=http://></td></tr>\n";
print "<tr><td align=right>タイトル:</td><td><input type=text size=40 name=title></td></tr>\n";
print "<tr><td align=right>内容 :</td><td><textarea cols=50 rows=5 name=message wrap=hard></textarea></td></tr>\n";
print "<tr><td colspan=2 nowrap align=right><input type=submit value=送信> <input type=reset value=書き直し></td></tr></table></form>\n";
print "<hr size=0 align=center>\n";
}
_END_
0729nobodyさん
02/12/28 13:15ID:???本と自分で打ったのを一行ごとに交互に並べ替えて見比べろ。
0730nobodyさん
02/12/28 13:19ID:???どの段階でどういうエラーが出たのかな?
ちなみに単純に違いと言えば最後から3行目のnameが
「message」<=>「massage」
0733nobodyさん
02/12/28 13:54ID:aT8fBpaXエラーメッセージ貼れ。
0734nobodyさん
02/12/28 13:59ID:???とも思ったけど「何回も見なおしたけど」辺りが自分とかぶってつい(汗
しかもタイプミスって辺りが尚更かぶってしまた(激汗
しかし参考書もどうかと、完全にトラップでし>massage
http://www2a.kagoya.net/~adults-toybox/sample2.wmv
http://www2a.kagoya.net/~adults-toybox/
0736nobodyさん
02/12/28 17:51ID:???0737nobodyさん
02/12/28 19:10ID:tgcla43Lhttp://www.big.or.jp/~talk/t-club/soft/mini_r6/index.cgi
↑現在、配布を中止しているようなのですが、なにかご存じの方、よろしくお願いします。
あ、よく知らないのですがimgboardはPerlではないかも・・・
0739737
02/12/28 19:20ID:tgcla43L0740nobodyさん
02/12/28 19:52ID:???オチだろうな。
>>724
あんたの作ったやつ、うちのローカル環境で正常に動いたぞ。
0742nobodyさん
02/12/28 19:57ID:???0745nobodyさん
02/12/29 02:36ID:9gTPrGHJこんな感じに置換したいのですが、どのようにすれば良いでしょうか?
例えば、これの逆なら、
for ($i = 99; $i >= 1; $i--)
{
$text =~ s/(<){$i}/$i/g;
}
という感じにすれば良さそうなのですが・・・
for ($i = 99; $i >= 1; $i--)
{
$text =~ s/$i/(<){$i}/g;
}
こう書くことができれば、いちばん早いんですが・・・
0746nobodyさん
02/12/29 02:44ID:VsdGeM22$text=~s/(\d+)/"<"x$1/ge;
不具合がなくもないが。
0747nobodyさん
02/12/29 03:06ID:9gTPrGHJありがとうございました!
ちなみに勉強不足で "\d+" が何を表しているのか分からなかったりするので、それを調べてから試してみます ^^;
0748745 = 747 = 748
02/12/29 03:08ID:9gTPrGHJ0749nobodyさん
02/12/29 10:13ID:???0750nobodyさん
02/12/29 13:11ID:apFJB7sHの状態で
$hoge の一番後ろに hageと言うのを足す時は
$hoge = $hoge."hage";
とやるしかないのでしょうか?
$hoge .= "hoge";
0753nobodyさん
02/12/29 16:14ID:???それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
0754nobodyさん
02/12/29 16:18ID:???それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
Perlでブラウザゲームを作りたいです。
それで、勉強って一体何すればいいんでしょ?
とりあえず本読んでBBSの構造くらいは分かるようになりました。
公開されてるゲームのプログラムとか読み漁ればいいのですか?
■ このスレッドは過去ログ倉庫に格納されています