【Perl】初心者コーナー Part19
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/02/09 00:24ID:s0tpWWxg1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【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。
0413nobodyさん
03/02/23 21:20ID:???スクリプトは間違ってなかったのですが
鳥の仕様でスタ(cgi-bin以下のファイルは操作できない)
婆茶とかハイマしか触ったこと無かったので分からなかった(;´Д`)
0415nobodyさん
03/02/23 21:26ID:???それじゃ最終的にファイル全部を配列に入れるわけだから同じだよ。
まあ、100KBぐらいだったら気にせずreverseでいいんでない?
0417nobodyさん
03/02/23 22:21ID:???レスありがとうございます。
平均100KBくらいなんですが、気にしなくてもいいのかもしれませんね・・
ちょっと>>416さんのところ、詳しく見させてもらいます。
ありがとうございました。
0418nobodyさん
03/02/23 22:24ID:???0419nobodyさん
03/02/23 23:49ID:???$n = 10;
for(1..$n){ 処理; }
と、しているのですがもっとベターなやり方はありますでしょうか?
0420nobodyさん
03/02/23 23:50ID:???0424nobodyさん
03/02/24 08:45ID:cCE/Sh/Gmod_perlを極めるためのおすすめ本・サイトを教えてください。
お願いします。
0426nobodyさん
03/02/24 10:50ID:???ユーザに入力して貰ったデータと照合する処理を実現したいのですが
何度試してみても結果がNGで戻ってきてしまいます
尚、照合処理は下記の様なシンプルなものです
if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) {
if (crypt($chkpassdata[1], $savedata[1]) eq $savedata[1]) {
print "password check OK...<br><br>\n";
$flg = 1;
}
}
$chkiddata[0] はユーザ入力にてIDが、$chkpassdata[1] はユーザにて入力されたパスワード文字列(平文)が格納されております
$savedata[0] は保存されているIDが、$savedata[1] は保存されている暗号化済みのパスワード文字列が格納されております
また $flg に 1 が格納されている場合は、check OK の HTML を書き出す処理をおこなっています
因みに、パスワード暗号化を行う処理は、別のPerlスクリプトで行っておりますが、これも何か関係がありますでしょうか
宜しくお願い致します
0427nobodyさん
03/02/24 12:20ID:???> if ($savedata[0] eq substr($chkiddata[1], 0, length($savedata[0]))) {
$chkiddata[1] は、なんなのさ?
if ($savedata[0] =~ /^$chkiddata[0]/) {
ぢゃなぁぃ?
0429424
03/02/24 12:48ID:???使い易く統合して機能追加したパッケージを作っいるので、
それがmod_perl環境でも動くように改良したいと思ってるんですが…。
気持ち悪いですか。うあああ。
0431426
03/02/24 14:55ID:???$chkiddata[1] の方にユーザで入力されたアカウント名が入っています、でした
今しがた print をIDチェック部分に噛ませて実行してみた所
ID 部分のチェックは問題なく認識できている様なのですが
どうしても暗号化パスワードとの比較が NG で戻ってきてしまいます...
0432nobodyさん
03/02/24 15:01ID:???0434nobodyさん
03/02/24 16:41ID:???chop $savedata[1];
0435434
03/02/24 16:42ID:???0437nobodyさん
03/02/24 18:02ID:???windows2000
Active perl 5.6.1 build 633
APACHE 1.3.27
の環境ですが
exec (又はsystem) で外部プログラムを呼び出したとき
コマンドライン上で実行した場合外部プログラムは問題なく起動するのに
ブラウザから呼び出した場合外部プログラムが起動する場合と
起動しない場合があるのは何故なんでしょう??
hoge.cgi
#!/usr/local/bin/perl
print "Content-type: text/html;charset=euc-jp\n\n"; #コマンドラインから呼び出す場合は要らない
system("program.exe");
外部プログラムはどのような物でも問題なく起動 c:>perl hoge.cgi
起動するものと起動しないものがある http://127.0.0.1/cgi-bin/hoge.cgi
0438nobodyさん
03/02/24 18:37ID:???起動する場合としない場合の違いを説明する事。
まずはpathが通っているかをチェックしる。
> 先生いいでつか?
このスレに代議士はいない。・・・はず?
0439nobodyさん
03/02/24 20:28ID:???違いは今のところパターンが把握できては居ませんが
どうやら何かしらのメッセージを標準出力に出力しないものは
起動していないような気がする。
例えば
system("dir");は
perl hoge.cgi
http://127.0.0.1/cgi-bin/hoge.cgi
共に問題なく動く
system("wmplayer");はブラウザから呼び出したときは動かない(起動しない)。
0440nobodyさん
03/02/24 21:04ID:???Apacheに理解できない出力したらいかんよ。
0441nobodyさん
03/02/24 21:26ID:38CGzi2z$year = $thisyear + int(( $thismon-1 ) /12 );
で nヶ月後は算出できるのですが…。
0443nobodyさん
03/02/25 00:21ID:???ここで落としたphpBB2.0.4をXREAに設置したのですが、
書き込み時に「"」が「?」に、「>」や「<:」が「&」になってしまいます。
phpをいじったの自体初めてで、どうすればいいのやらさっぱりです。
既知の不備等、ご存じの方がおりましたらご教授下さい。
0446nobodyさん
03/02/25 06:42ID:???0447nobodyさん
03/02/25 07:17ID:???理解できん。
0448nobodyさん
03/02/25 07:56ID:???Web制作
http://pc2.2ch.net/hp/
k
0449nobodyさん
03/02/25 11:40ID:???板にはともかくスレに誘導はしてないだろうよ…
0450437
03/02/25 15:57ID:???perlからtelnetで接続させて起動させるように書きました。
まあ、目的は達成できたのでヨシとします。
暇なときにでも勉強するでス。
ありがとう。
余談だがwin9x系だとtelnetdにろくな物が無いのに愕然とした(涙
0451nobodyさん
03/02/25 17:11ID:wR5lMZNWsystemでファイルのコピー等を行った場合に、「○個のファイルをコピーしました」
などのsystemの返り文字が表示されますが、これをスクリプト上で
非表示にする方法はないものでしょうか。
___________
$from="コピー元パス";
$to="コピー先パス";
system("copy $copyfrom/A $copyto");
→1個のファイルをコピーしました。
___________
ご存知の方いましたらお願いします。
0452451
03/02/25 17:13ID:wR5lMZNWsystem("copy $copyfrom/A $copyto"); → system("copy $from/A $to");
0453nobodyさん
03/02/25 20:06ID:???system("copy $from/A $to > nul.txt");
とかでダミーファイルにリダイレクトするってのはどう。
0454nobodyさん
03/02/25 20:33ID:???anhttpdって、クライアント側への表示を勝手にしちゃうの?
って、気づけばここperlスレだった…。
0455453
03/02/25 20:57ID:???/devディレクトリないからあたりまえか。
0456nobodyさん
03/02/25 21:47ID:???nulはデバイスだよ。ファイルとかディレクトリじゃないからパス名はつけられない。
逆にパス名つけたらただのファイルになっちゃう。
0458nobodyさん
03/02/25 23:55ID:???455はUNIXと間違えたと思われ。
UNIXはデバイスファイルという概念を持っていて、デバイスをファイルのように扱う。
そしてパスが/dev/nul。
0459nobodyさん
03/02/26 01:07ID:???use File::Copy;
copy("file1","file2");
0460451
03/02/26 10:45ID:JNJUfkpu最終的にはお客さんの環境に入れ込むのですが、
perlのバージョンが5.0な事とモジュールをこちらで入れる権限がないので
こんな遠回りな事になってしまってるんです・・(涙
system("copy $from/A $to > nul.txt");
は構文ミスになってしまいました。
つかDOS勉強しないとよくわからないって事なんですね・・。
とりあえず応急処置として<!-- -->で囲んでおく事にして、
引き続き調べてみます。
#これってperlの質問じゃなかった・・?すみません
0461nobodyさん
03/02/26 11:07ID:???0462451
03/02/26 13:31ID:???うはー!!できましたっ!
$ENV{COMSPEC}なんて初めて見ました。これなら違う環境でも安心して動かせますね。
本当にありがとうございました。
今夜は2ちゃんに足を向けて眠れませんです。
0463nobodyさん
03/02/26 15:07ID:WD8DDVVN値が一個の場合は(例えば $test=first)
if($first eq ""){
処理;
}
として、
カンマ区切りで複数の場合は(例えば $test=first,second)
if(($first eq "") || ($second eq "")....$testに入ってる値の数だけorで追加..){
処理;
}
という処理をやりたくて
今は$testをカンマで分割して配列にいれて(例えば @x)
$testの値が複数だったばあいは
foreach $i (@x);
if($x[$i] = ""){
処理
}
}
という感じで回して処理してます。動作は問題なくするのですが、
もっとスマートないい方法ないでしょうか?
アドヴァイスをよろしくお願いします
0465まる
03/02/26 17:30ID:T5eWammJ配列で有効にするタグの中身を設定して、それに合致しないものは
gt;などで文字化する、というふうに考えたのですが、これでは
有効になるはずのタグまで文字化されてしまいました。
どう書けば動くようになるでしょうか。
#もっとスマートな書き方もあるような気がするけど・・(^-^;
#設定項目
@tag = "('b'.'/b'.'i'.'/i'.'u'.'/u'.'s'.'/s')";
#タグ無効処理
sub tag {
$value =~ s/</>/g;
$value =~ s/>/</g;
}
0466まる
03/02/26 17:31ID:T5eWammJsub decode{
if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("本文が長すぎます"); }
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# S-JISコード変換
&jcode'convert(*value,'sjis');
# タグ処理
if ($value ne "<@tag(.*)>") { &tag; }
#改行処理
$value =~ s/\r\n/<br>/g;
$value =~ s/\r/<br>/g;
$value =~ s/\n/<br>/g;
#削除情報
if ($name eq "del") { push(@DEL,$value); }
$FORM{$name} = $value;
}
}
0467まる
03/02/26 17:32ID:T5eWammJこの書き方だと・・(って動かないうちにいっててもしょうがないって)
0468nobodyさん
03/02/26 18:43ID:???0469nobodyさん
03/02/26 19:14ID:h/xtR2PFこれを和鳥に設置したいのですがどういじっても表示されません。
設置自体が不可能なら諦めますが、もし方法があるならお教えいただけませんでしょうか。
0470nobodyさん
03/02/26 19:20ID:???0471nobodyさん
03/02/26 20:23ID:???文字修飾タグだけならspanタグだけ通るようにしてみるとか。
$value =~ s/\t//g; # [TAB]が含まれていたら削除する(これを'<','>'の代用にするため)
if (($value =~ s{(<b[^>]*>)}{$1}g) != ($value =~ s{</b>}{$1}g)){
# 開始タグと終了タグの数が一致しないので鰓。
print qq{タグ鰓};
}
else {
# < を \tに、 > を \t\t に。
$value =~ s{<(b[^>]*)>}{\t$1\t\t}g;
$value =~ s{</b>}{\t/b\t\t}g;
}
上記を<i><u><s>分処理する。(ハシュを使ってループするなり・・・)
# 他のタグは無効と言うことで・・・
$value =~ s/</</g;
$value =~ s/>/>/g;
# \t\t,\tを復元。
$value =~ s/\t\t/>/g;
$value =~ s/\t/</g;
あーあほらしくなってきた鬱。
0472nobodyさん
03/02/26 20:31ID:???&忘れてた鬱。
$value =~ s/</</g;
$value =~ s/>/>/g;
↓
$value =~ s/</</g;
$value =~ s/>/>/g;
0473nobodyさん
03/02/26 20:46ID:???タグの無効処理、一部有効処理は正規表現スレにいけ。
最近でも出た話題だからすぐに見つかるはず。
>>463
どうでもいいが、根本的に考え方がずれてるんだと思われ。
その処理で一体何がしたいのか言ってみるのもあり。
別のもっとスマートなやり方がみつかるかも。
>>469
CGIの設置は、
1.そのCGIを配布しているサイト
2.そのCGIを設置したいサイトのサポート
の順で方法を調べて、それでもさらにわからないなら諦めるのが普通。
それでも諦めきれない未練がましい人間なら、そうだな、
CGIスレに行けばもしかしたらいけるかも知れない。
1も2も失敗しているのなら、いける可能性はほとんどないだろうが。
0474nobodyさん
03/02/26 21:23ID:???CGIをperlで作成しているのですが
ゲームのロビーサーバーの代わりを ホームページ上で作成しようと考えているのですが、
ホームページを参照している クライアントに
TCP-IP、ポート指定 でデータを直接送ることはできるのでしょうか?
ホームページは、フリーでCGIが使えるます。
流れ的にこんな感じです。
0.各クライアントが ゲームを起動しておく。
1.ホームページでログイン処理.
2.ログインしたクライアントのIPアドレスを取得しておく.
3.ホームページ上でゲームの対戦相手を決める.
4.相手が決まったら CGIから各クライアントに
ログインしたときに取得したIPアドレス、ゲーム専用のポートに
対戦相手のIPアドレス、対戦相手の情報を送信して
ピアツーピア接続で 対戦させる。
どうでしょうか 可能ですか?
0476nobodyさん
03/02/26 23:02ID:???可能。詰まったらまたおいで。
0477nobodyさん
03/02/26 23:04ID:???HTMLとブラウザを使っている限り、サーバー側からの情報の送りつけはまず無理と考えろ。
これはPerlとかに限らない話なので、これ以上はスレ違いになるので詳しい説明はしない。
文意を汲み取るならば、>>474のやりたいことは、
ユーザーがブロードバンドであることを前提にして、
鯖を用意し、ユーザーにJavaサーブレットやHSPで作ったexeなどを使ってもらうのが一番現実的だと思う。個人レベルでは。
なので、本気でやる気ならばそれぞれ専用のスレに移動しろ。
0478nobodyさん
03/02/27 11:20ID:SWu201Chpush(@array,"b");
push(@array,"a");
push(@array,"c");
foreach $value (@array){ print "$value\n"; }
これを実行すると、a b a cとなります。
aは1回目に既に配列の中にあるので2回目のaは入れたくないのですが、
どうすればいいのでしょうか。
0479nobodyさん
03/02/27 11:35ID:???push(@array,"a");
push(@array,"b");
#push(@array,"a");
push(@array,"c");
0480nobodyさん
03/02/27 11:42ID:???0483nobodyさん
03/02/27 12:38ID:???# 先に重複をチェックする方法
$append = sub { push(@array, $_[0]) if index("@array", $_[0]) == -1 };
$append->("a");
$append->("b");
$append->("a");
$append->("c");
# ハッシュを使って後からキーを取り出す方法
$hash{"a"} = "";
$hash{"b"} = "";
$hash{"a"} = "";
$hash{"c"} = "";
map { print "$_\n" } sort keys %hash;
0484nobodyさん
03/02/27 14:19ID:???> >>463
> どうでもいいが、根本的に考え方がずれてるんだと思われ。
> その処理で一体何がしたいのか言ってみるのもあり。
> 別のもっとスマートなやり方がみつかるかも。
テキストボックスの名前を羅列したファイルを参照して
フォームメール中の対応するテキストボックスを未入力不可にするスクリプトで
氏名とか住所とかはテキストボックスが複数にわかれてるので
firstNAME,familyNAMEと設定ファイルに書くと
orで条件わけしようと思ったんですが
よく考えたらorにする必要なかったです
氏名の場合なら単純に
firstName
familyName
と設定ファイルに書いて
一個ずつ条件分岐させればよかった話でした。
そもそも未入力不可のテキストボックスを指定する方法があまりよくない気がしてきだした…
0485nobodyさん
03/02/27 16:01ID:???下のやり方でうまくいきました
有難うございます
0486nobodyさん
03/02/27 18:06ID:???0487nobodyさん
03/02/27 19:13ID:???#IN:$seireki 西暦
#OUT:$val[0] 元号 $val[1] 年
function wareki($seireki) {
$gengo=array(
'1989'=>'平成',
'1926'=>'昭和',
'1912'=>'大正',
'1868'=>'明治'
#後は自分で
);
while(list($nen, $gen) = each($gengo)) {
if($seireki >= $nen) {
$val[0] = $gen;
$val[1] = $seireki - $nen + 1;
return($val);
}
}
exit;
}
?>
0488487
03/02/27 19:18ID:???すまん
0490486
03/02/27 21:39ID:???さんこす
0491nobodyさん
03/02/28 08:20ID:nTu2mU2Wキー1=値1
キー2=値2
みたいなフォーマットのファイルを扱うクラスがどこかにあったと思うのですが、
名前を教えて下さい。
0492nobodyさん
03/02/28 08:24ID:???0493nobodyさん
03/02/28 08:37ID:0F+7IAI5use Class;
my $class = new Class();
$class->method();
$class = undef;
クラスの使い方なんか、たったこれだけじゃなかとですか。
0495nobodyさん
03/02/28 13:08ID:???0496nobodyさん
03/02/28 14:41ID:6S1ggN3lただ、標準モジュールにそういうクラスがあるなら、配布しなくていいからそっちのほうがいいです。
0498nobodyさん
03/02/28 19:27ID:???new Class()で返ってきたのは、おそらく、オブジェクトなので$classという変数名は不適切。
変数を破棄する場合は、undefを代入するよりも、undef $hoge;の方が意味がわかりやすい。
0500nobodyさん
03/02/28 20:15ID:???0502nobodyさん
03/03/01 21:02ID:???ファイルのリスト @files を、更新が古い順に並べ替えたいんですが…
一応自分でも考えてみました。
@new = ();
foreach (@files){
push @new, (stat $_)[9] . "<>" . $_;
}
@files = ();
foreach (reverse(sort @new)){
my(undef, $x) = split /<>/;
push @files, $x;
}
これでできそうなんですが、もっといい方法があるような気がします。
もっといい方法があれば教えて下さい
お願いします。
0503502
03/03/01 21:25ID:???0504nobodyさん
03/03/01 21:49ID:???my %hash;
foreach(@new){
$hash{(-M $_)} = $_;
}
foreach(sort{$b <=> $a} keys %hash){
push(@file, $hash{$_});
}
うーん…。
0505nobodyさん
03/03/01 21:58ID:???でいけるかな
0506nobodyさん
03/03/02 02:50ID:???同時刻のファイルが消される。
>>505
比較の度に stat を呼ぶのはマズい。
手っ取り早くやるならこう。
@files =
map $_->[0],
sort { $b->[1] <=> $a->[1] || $a->[0] cmp $b->[0] }
map [ $_, -M ],
@files;
0507nobodyさん
03/03/02 11:30ID:???0509504
03/03/02 12:33ID:???確かに同時刻のファイルが消されます。
忘れてました。
シュワルツ変換(Schwartzian Transform)ですね。
やっぱり覚えた方がいいかな。。
0510nobodyさん
03/03/02 13:14ID:???0511nobodyさん
03/03/02 15:00ID:???Schwartzian Transform はデリファレンスのオーバーヘッドがあるんで、
同じ事をより効率良くやるには地道に作業変数を作ってソートした方が
いいらしい。
{
my @time;
push @time, -M for @file;
@file = @file[
sort {
$time[$b] <=> $time[$a] || $file[$a] cmp $file[$b]
} 0..$#file
];
}
>>508
1行(と言うか1文)に詰め込む云々より、この作業変数の為にブロックが
増える所がエレガントでないとは思うがな。
■ このスレッドは過去ログ倉庫に格納されています