トップページ⇒php
1001コメント374KB

Perlコーディング初心者質問スレ Part 54

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/02/10(土) 19:21:23ID:???
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc10.2ch.net/test/read.cgi/php/1164519503/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0455nobodyさん2007/03/19(月) 01:31:00ID:y4PXC6RO
場違いな質問ですみません。
入門書見ながら掲示板作って出来上がったら目標がなくなってしまいました。
次の材料におもしろいCGIなんかがあったら教えてもらえませんか?
0456nobodyさん2007/03/19(月) 01:34:42ID:???
RSSリーダーなんかいいんじゃね?
0457nobodyさん2007/03/19(月) 01:37:03ID:y4PXC6RO
>>456
ありがとうございます。
早速、ぐぐってきます。
0458nobodyさん2007/03/19(月) 01:45:06ID:???
PlaggerLDR でよくね?
0459nobodyさん2007/03/19(月) 02:29:39ID:???
>>454
ありがとうございます。
ぐぐってみます。
0460nobodyさん2007/03/19(月) 10:26:01ID:???
やっぱり春だからだろ。
0461nobodyさん2007/03/20(火) 14:43:14ID:???
HTMLを読み込み、<body>と</body>で挟まれた部分を抜き出そうとしてますがうまくいきません。
正規表現で下記のようにしましたがマッチしないです。
$html_template =~ /<body>(.*?)</body>/i;
全ての改行を削除してから上記の文に掛けてやると抽出できます。

改行とかを削除しないで指定した範囲を抜き出すにはどうすればよいでしょうか?
0462nobodyさん2007/03/20(火) 14:57:48ID:???
改行もマッチさせればいいんじゃね?
0463nobodyさん2007/03/20(火) 15:01:02ID:???
$html_template =~ /<body>\n(.*?)</body>/i;

syntax error at D:/web/tnx_club/www/index.cgi line 59, near "/<body>\n(.*?)</body"
Execution of D:/web/tnx_club/www/index.cgi aborted due to compilation errors.

上の正規表現の行が LINE 59。
0464nobodyさん2007/03/20(火) 15:02:52ID:???
ミスったw

\n 加えても no match でした。
0465nobodyさん2007/03/20(火) 15:15:32ID:???
m{<body>(.*)</body>}s
0466nobodyさん2007/03/20(火) 15:17:08ID:???
>465
サクっとでけたw
mの有無で変わるものなのか・・・thx
0467nobodyさん2007/03/20(火) 15:19:51ID:???
>>461
ちがう。肝はsだよ。mつかわないでこう書いてもいいし。

$html_template =~ /<body>(.*?)</body>/is;

s
文字列を単一行(single line)として扱います。つまり、``.''が通常はマ ッチしないような改行を含めた、全てのキャラクターにマッチするようにします。
0468nobodyさん2007/03/20(火) 15:22:25ID:???
なるほど。
m 抜きでやってきたら同じ動きをした。
以前同じようなことで試行錯誤した記憶があるから、さすがに今回で覚えたかなw

重ね重ねありがとぅ。
0469nobodyさん2007/03/20(火) 17:17:28ID:???
m区切り文字区切り文字
の区切り文字が/のときに限ってmを省ける、というのがPerlでの//の正体。
0470nobodyさん2007/03/20(火) 21:52:03ID:???
/<body>(.*?)<¥/body>/;
0471nobodyさん2007/03/22(木) 22:01:09ID:gLp6RvZ+
すいません複数引数があるときの
まとめて引渡し方がワカラないのですがなんでしたでしょうか?

sub test{
my $data1=shift;
my $data2=shift;
   :
}
というのを
sub test{
my @data=ほげほげ
}
と出来た気がするのですが↑のほげほげに入れる単語なんでしょうか?

以上 ご教授いただけるとありがたいです
0472nobodyさん2007/03/22(木) 22:03:27ID:???
@_

shiftは、引数を省くと、メインでは@ARGV、サブルーティン内では@_が
対象になる。
0473nobodyさん2007/03/23(金) 00:37:10ID:ZyRaN274
質問です。
Catalyst + DBIx(PostgreSQL)で開発しているのですが、Helperスクリプト経由で
Schemaを作る場合、public スキーマのテーブルしか見てくれません。
スキーマを指定する方法は無いのでしょうか?

直感で、Alter roll loginid SET search_path TO myschemaしたけど駄目でした。
0474nobodyさん2007/03/23(金) 02:26:03ID:????PLT(12980)
ヘルパーとSchemaクラス云々だからCatalyst::Model::DBI::Schemaだよね?
DBD::PgがPgのスキーマをちゃんとサポートしてないから
どっかで
$schema->storage->dbh->do("SET search_path TO myschema, public");
みたいなことを自前でやらないとだめなんじゃないかな
てけとうでご免
というかpublicスキーマは使わな(ry
0475nobodyさん2007/03/23(金) 03:33:10ID:???
俺はヘルパー使わないで、Schema自分で書いたな。
0476nobodyさん2007/03/23(金) 23:55:51ID:ZyRaN274
回答ありがとうございます。
>>474
かなり色々なものでラッピングされちゃってて、手が出しにくい状況です。
あと、publicスキーマを使いたくないから悩んでいるわけで。

>>475
やっぱ男らしくそうですか。

いまのところ、publicスキーマでヘルパー走らせて、Dropしてから本当のスキーマにCreate tableするという便利だか不便なんだかわかんない状況で使ってます。
テーブル数が多いとそこそこ楽な気もするが、どのみちエクセルでテーブル設計書を作っているから、そこからDDLとスキーマをマクロで吐き出すようにしたほうが潔いような気もする今日この頃。
0477nobodyさん2007/03/26(月) 04:44:44ID:???
utf8なコードで、マルチバイトが含まれてるかを判定するにはどのようにすれば
いいでしょうか。先頭1ビットで判定するみたいなことまで調べたのですが、
正規表現で範囲指定することは可能でしょうか?
0478nobodyさん2007/03/26(月) 08:04:04ID:???
そのマルチバイトってのは
Perlの内部的なワイド文字か
それともただのUTF-8の文字列かどっち?
0479nobodyさん2007/03/26(月) 09:18:04ID:???
/\P{IsASCII}/ とか?
0480nobodyさん2007/03/26(月) 12:48:08ID:???
ありがとうございます。

>>477さんので解決したっぽいです。ちなみにuse charnames ":full"しなくても
動きました。

>>476さん

違いをよくわかっていません。が、調べられそうなので調べてみます。
0481nobodyさん2007/03/26(月) 18:31:41ID:???
アンカがずれてるのは俺の環境が原因かと思って
ログを何度も読み込みしなおしてしまった
0482480=4772007/03/26(月) 22:30:29ID:???
>>478,>>479でした。失礼しました!
0483nobodyさん2007/03/27(火) 20:50:22ID:VNeopaMK
ニワンゴ(メールを送信するとそのメールに記された内容に基づいてスクリプトが実行され結果がメールで返ってくる)のような仕組みを自分で構築したいのですが、Perlでそれをやろうとしたら具体的にどんな処理が必要になるのでしょうか?
メールの解析は出来そうなんですが、いつ送信されるか分からないメールを待って、メールが来たらそれを受けて処理を始める仕組みをどう作れば良いのか分からないので教えて頂けませんか?
0484nobodyさん2007/03/27(火) 20:51:46ID:???
適当なSMTP鯖使えばええやん
0485nobodyさん2007/03/27(火) 21:07:13ID:WKbYIT6w
つうかニワンゴとPerlでググれば答えが出てる件
0486nobodyさん2007/03/28(水) 11:06:28ID:???
スレッド式の掲示板で同じIPアドレスからでも
スレッドごとに違うIDを表示したいのです。
どういう風にやったらよいのかよくわからないので
参考になるような例を教えて欲しいです。
0487nobodyさん2007/03/28(水) 11:08:23ID:???
ID生成にスレッド識別用のコードも利用すれば?
0488nobodyさん2007/03/28(水) 11:22:02ID:???
>>487
折角のレスありがとうございます。
それをPerlでやるとなると、どういう風な感じになるのでしょうか?
そもそも別のIPから同一のIDを出さない、しかしIDからIPがばれないようにする
という所で、もう行き詰まって、いっぱいいっぱいです。
0489nobodyさん2007/03/28(水) 11:47:27ID:???
ふつーcryptに突っ込んでるだけじゃない?
0490nobodyさん2007/03/28(水) 11:52:32ID:???
>>489
GNU拡張の$1$〜使うなら別だが素のcryptは先頭8文字しかみないので
場合によっては役に立たない。特にIPアドレスを文字列で食わせたり
したらアウトだね。

0491nobodyさん2007/03/28(水) 12:09:26ID:???
ハッシュ関数ぐらい自分で書け
0492nobodyさん2007/03/28(水) 12:18:19ID:???
>>490
そうです、単純にやったのでは文字数の問題があるのと
あと、IPアドレスって数字と区切りの点のみを暗号化するってことじゃないですか
やろうと思えば簡単にIDからIPアドレスの一部がわかっちゃうのではと
だから他の人はどうやってるのか、ちょっと具体例が知りたかったのです
0493nobodyさん2007/03/28(水) 12:20:41ID:???
自分用にパスワード自動生成スクリプト作っています。

配列 @character を次のように定義しました。
@character = ('a'..'z', 'A'..'Z','0'..'9');

しかし "l" (小文字のエル) や "1" (数字の一) 等の文字は紛らわしいので配列から排除したいです。

@character = ('a'..'k', 'm-z', 'A'..'Z','0'..'9'); みたいにやるとコードが汚くなるので、
一度配列を定義した後、特定の文字の要素を削除したいのですが、要素 'l' を削除するスマートな方法はないでしょうか?

初歩的な質問で申し訳ないですが、よろしくです。

0494nobodyさん2007/03/28(水) 12:41:03ID:???
Perl の勉強用に Windows 版 ActivePerl 5.8.8.820 をデフォルト設定でインスコしました。
.pl ファイルをダブルクリックすると実行されるんですが、終わった後に勝手にコマンドプロンプトが終了してしまいます。
ダブルクリックのみで実行して、終わったらそのままコマンドプロンプトを終了させない方法は無いでしょうか?
教えていただけたら嬉しいです。
0495nobodyさん2007/03/28(水) 12:48:08ID:???
@chars = ('a'..'z', 'A'..'Z', '0'..'9');
@omit = qw(1 l);

map { $idx{$_} = $i++ } @chars;
map { splice(@chars, $idx{$_}, 1); } sort { $idx{$b} <=> $idx{$a} } @omit;

print @chars,"¥n";
04964932007/03/28(水) 12:48:29ID:???
とりあえず、なんとか自力でできました。
「これは酷い」という部分があったら、教えてくれると助かります><

#!C:\Perl\bin\perl.exe

use strict;

# パスワードの文字数を聞く
print STDOUT 'パスワードの文字数を入力して下さい。';
my $passLength = <STDIN>;

# 使用許可文字と使用拒否文字の定義
my @allowChara = ('a'..'z', 'A'..'Z','0'..'9');
my @denyChara = ('b', 'i', 'l', 'q', 'D', 'I', 'O'. '0', '1', '9');
for my $allowCharaNo (@allowChara) {
  for my $denyCharaNo (@denyChara) {
    if ($allowChara[$allowCharaNo] eq $denyChara[$denyCharaNo]) {
      splice(@allowChara, $allowCharaNo, 1);
    }
  }
}

# ランダムなパスワードを生成・出力
srand;
my $password = '';
foreach (1..$passLength) {
  $password .= $allowChara[rand(@allowChara)];
}
print STDOUT $password;

exit;
04974932007/03/28(水) 12:49:25ID:???
>>495

す、凄い…。
>>496 のごちゃごちゃになっていた部分が凄いシンプルに!
登場した関数をぐぐって調べてみます。
ありがとうございます。
0498nobodyさん2007/03/28(水) 12:52:27ID:???
map BLOCK ARRAYは短く書くために使っているので、
for (ARRAY) BLOCK に置き換えると理解しやすいと思われ。
0499nobodyさん2007/03/28(水) 12:52:50ID:???
sleep
cmd /K perl
0500nobodyさん2007/03/28(水) 12:55:13ID:???
ん?いっぱいレスが挟まった。
>>499 は >>494 の回答。
0501nobodyさん2007/03/28(水) 13:03:46ID:???
>>493
@character = grep !/l|1/, ('a'..'z', 'A'..'Z','0'..'9');
05024942007/03/28(水) 13:04:35ID:???
>>499
thxです
前者は動かない…('A`)
------------------
print STDOUT 'aaa';
sleep;
------------------
だと何も表示されずに固まります。
理由は最後まで実行してからコマンドプロンプトに結果送っているからだと思われます。

後者は、バッチファイルやショートカットを作って、
"cmd /K perl ファイル名" を呼び出すってことですね。
こっちはできました。
05034932007/03/28(水) 13:06:31ID:???
>>501
シンプルすぎて感動で涙が出ました…。
(l または 1) にマッチするもの以外を配列に突っ込む、日本語で書くことをそのままPerlにしたといった感じですね。
05044952007/03/28(水) 13:06:40ID:???
>>501
ぽむ☆

なにをややこしく考えていたのだろうorz
0505nobodyさん2007/03/28(水) 13:09:01ID:???
>>493 逆にしてもいい
@character = grep 'bilqDIO019' !~/$_/, ('a'..'z', 'A'..'Z', '0'..'9');
0506nobodyさん2007/03/28(水) 13:20:15ID:???
>>505
なるほどね
右の内容が順番に評価されて $_ には各項目が入る
パターンマッチ演算子を使ってその文字列の中にアルファベットがあるか調べる
単純かつ美しい流れ

しかしこんなくだらん命題でいろいろな答えがでるとはおもわんかった
0507nobodyさん2007/03/28(水) 13:25:54ID:???
TIMTOWTDI
0508nobodyさん2007/03/28(水) 17:03:34ID:sUHWjomT
ソケットで獲得したページからリンクタグを抽出して表示させたいんですがうまくいきません

while(<SOCK>){
while(s/\n|\r\n|\r//is){}
if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is){
push @img, "$2\n";
}
}

なんか獲得できるのとできないのがあるみたいで・・・
$_に複数個あるときも1つしか抽出できませんでした
0509nobodyさん2007/03/28(水) 17:10:42ID:???
>>508
そういうときはソケットから読んだ文字列がどうなってるか確かめて、

1)ソケットから読んだ文字列がおかしい
2)ある文字列のときにif以後がうまく働かない

のどちらであるか切り分けしてから質問するものだ。
0510nobodyさん2007/03/28(水) 22:46:18ID:???
>>508
while(s/\n|\r\n|\r//is){}
はおかしすぎる

if($_ =~ /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is) は、
「$_ が /(<a href="(http:[\w\.\~\_\-\/\?\&\+\=\:\%]+)")/is」にマッチしたら
なので、最初の一個がマッチした時点でpushし、次のループに移行する
つまり$_にいくつaタグがあろうと、最初の一個しか抽出できない

書くならこんな感じか?

$_ = do {local $/; <SOCK>};
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);

あと、aタグの記法がこれで固定されているって判っているなら構わないけど
hrefの前に別の属性が記述されている場合とか
「"」じゃなくて「'」で括られていたりコーテーションがついていなかったり
する場合も考慮するのが普通かと
05115102007/03/28(水) 22:51:27ID:???
あ
my @img = map {"$_\n"} (/<a href="(http://.*?)"/gis);
は
my @img = map {"$_\n"} (/<a href="(http:\/\/.*?)"/gis);
に訂正
偉そうに書いておいてエスケープ忘れた…
0512nobodyさん2007/03/29(木) 00:42:31ID:???
>>509
今後の参考にさせていただきます^^;

>>510
>最初の一個しか抽出できない
あ〜・・・だから抽出したリンク数が合わなかったんですね^^;
ありがとうございます。

これからmap関数?を調べて(初めて見るんで;)それから試してみようと思います
0513nobodyさん2007/03/29(木) 12:49:04ID:???
スレッドごとに違うIDを表示したいという件で質問した者ですが、自己解決しました。
回答はもう結構です。お騒がせしました。
0514nobodyさん2007/03/30(金) 04:04:21ID:???
WinXP 上の ActivePerl で、再帰的にファイル名を収集しています。

「表」というディレクトリに chdir して、
その中で opendir, readdir とかしたいのですが、うまくいきません。

うまくいく方法があればお願いします。
0515nobodyさん2007/03/30(金) 06:41:02ID:???
なんかその質問ム板で見た記憶がある
答えは忘れたけどw
0516nobodyさん2007/03/30(金) 07:44:15ID:???
File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか
0517nobodyさん2007/03/30(金) 07:44:58ID:???
File::Finder忘れてた
0518nobodyさん2007/03/30(金) 11:12:45ID:Ov/YkxL/
sub loadFormdate
{
my($query,$pair);
if($ENV{'REQUEST_METHOD'} eq 'POST'){
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
}
else{
$query = $ENV{'QUERY_STRING'};
}
foreach $pair(split(/&/,$query)){
my ($key,$value) = split(/=/,$pair);

$value =~ tr/+/ ;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$FORM{$key} = $value;
}
}


というプログラムでhttp://www.e777.co.jp/perlcw/perlcw.htmlのサイトを使って文法チェックしたところ

Bareword found where operator expected at tmp.pl line 75, near "9a"
(Might be a runaway multi-line // string starting on line 74)
(Missing operator before a?)
Unquoted string "a" may clash with future reserved word at tmp.pl line 75.
syntax error at tmp.pl line 75, near "9a"
Unrecognized file test: -F at tmp.pl line 75.

が出てきました
正しいプログラムをコピペしても出てきたんですが
どこが違うか教えていただけないでしょうか??
0519nobodyさん2007/03/30(金) 11:53:25ID:???
$value =~ tr/+/ /;
スラッシュがぬけてる。
0520nobodyさん2007/03/30(金) 12:14:19ID:???
> File::FindとかFile::Find::IteratorとかIO::AllとかPath::Classとか

File::Find と Path::Class はうまく扱えませんね。
0521nobodyさん2007/03/30(金) 12:17:30ID:???
> なんかその質問ム板で見た記憶がある
> 答えは忘れたけどw

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/10

これもうまく動かない。
0522nobodyさん2007/03/30(金) 20:49:19ID:???
>518みてて思ったんだけど、

s/%([\da-f]{2})/chr hex $1/ieg;

s/%([\da-f]{2})/pack 'H2', $1/ieg;

どっちがはやいんだろ。
0523nobodyさん2007/03/30(金) 21:28:36ID:???
use strict;
use Benchmark qw( timethese cmpthese ) ;
use CGI::Util qw(escape);
my $str = escape("Perlコーディング初心者質問スレ");
my $r = timethese( 100000, {
chrhexi => sub {
local $_ = $str;
s/%([\da-f]{2})/chr(hex($1))/ieg;
},
chrhex => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/chr(hex($1))/eg;
},
packh2i => sub {
local $_ = $str;
s/%([\da-f]{2})/pack('H2', $1)/ieg;
},
packh2 => sub {
local $_ = $str;
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
},
} );
cmpthese($r);
0524nobodyさん2007/03/30(金) 21:29:20ID:???
Benchmark: timing 100000 iterations of chrhex, chrhexi, packh2, packh2i...
chrhex: 8 wallclock secs ( 5.21 usr + 2.13 sys = 7.34 CPU) @ 13623.98/s (n=100000)
chrhexi: 7 wallclock secs ( 6.72 usr + 0.71 sys = 7.43 CPU) @ 13458.95/s (n=100000)
packh2: 8 wallclock secs ( 7.25 usr + 0.57 sys = 7.82 CPU) @ 12787.72/s (n=100000)
packh2i: 8 wallclock secs ( 7.54 usr + 0.61 sys = 8.15 CPU) @ 12269.94/s (n=100000)
Rate packh2i packh2 chrhexi chrhex
packh2i 12270/s -- -4% -9% -10%
packh2 12788/s 4% -- -5% -6%
chrhexi 13459/s 10% 5% -- -1%
chrhex 13624/s 11% 7% 1% --

perl -v
This is perl, v5.8.8 built for i386-linux-thread-multi
uname -a
Linux colinux.localdomain 2.6.11-co-0.6.4 #1 Mon Jun 19 05:36:13 UTC 2006 i686 i686 i386 GNU/Linux
05255182007/03/31(土) 06:34:34ID:x8D9Mjhz
>>519さん
あっ本当ですね
でも文法でひっかかるのはその下の
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;という部分なんです
05265182007/03/31(土) 07:58:19ID:x8D9Mjhz
>>519さんの言うとおりにしたら出来ました
エラーってでるとこが悪いとは限らないんですね
ありがとうございました
0527nobodyさん2007/03/31(土) 11:00:31ID:???
だから、/を補えば出なくなるが?
/がないから、s/の/までがtrだと思われてるわけだろ?
0528nobodyさん2007/03/31(土) 11:01:12ID:???
スマン、526が目に入ってなかった。
0529nobodyさん2007/04/01(日) 07:53:31ID:uYKSgLT/

�T if(not exists $FORM{'adminpass'}) {
printGatePage();
  }
�U  elsif($FORM{'adminpass'} eq $ADMINPASS) {
loadUserfile();

   }
   else {
printErrorPage("管理パスワードが違います。");
   }
   exit;
というプログラムでif文とelsif文について教えてください
�Tが真 つまり$FORM{'adminpass'}がなかった場合
�Tのプログラムが実行されて�Uのelsifのプログラムは実行されないはずなんですが
本によれば�Uのプログラムも実行されるんです
どういうことかと言いますと
�Tで真
→$FORM{'adminpass'}がないのでprintGatePage();で$FORM{'adminpass'}を存在させるようにする
→�Uのプログラムが実行
となっています
これは本当は�Tが真であれば�Uのプログラムは実行されず終わるんではないでしょうか?
よろしくおねがいします


0530nobodyさん2007/04/01(日) 08:34:15ID:???
自分で確かめてみればいいじゃん
0531nobodyさん2007/04/01(日) 08:43:42ID:???
>>529
# ローマ数字(I、II、III、…)は機種依存なので使うのをやめましょう
# 本によれば、というからには、本のタイトルや出版社など原典がわかるようにしましょう

%FORMについてなにも説明がありませんが、はフォームデータを解析・デコードして入って
いるのだと思います。で、Iが真ならばIIは評価されないというのはその通りです。

なお、「$FORM{'adminpass'}がなかった場合」というのは、%FORMに adminpassという
キーが存在しなかった場合、という意味です。普通パスワードの入力欄は、inputタグを
使うのであり、空欄のままsubmitを押しても、"adminpass="という文字列が送られて
きますので、それを%FORMに格納した場合、 adminpassというキーは存在しているので、
Iは常に偽となります。パスワードが空欄かどうかを判定するには、existsではなく
空文字列との比較($FORM{adminpass} eq "")をする必要があります。
05325292007/04/01(日) 09:36:29ID:uYKSgLT/
>>530さん
自分で確かめたらelsifが実行されていたのでここで聞いています
>>531さん
詳しい説明ありがとうございます
ではなぜelsifのプログラムが実行されたのでしょうか??
プログラム全部を載せたいのですが改行で無理みたいなので…

sub printGatePage
{
print <<END;
Content-type: text/html; charset=$CHARSET

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head><title>ゆーざーかんり</title></head>
<body>
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定">
</form>
</body>
</html>
END
}

本の名前は『10日でおぼえる Perl/CGI』著:高橋大吾です
この本の6章で認証プログラムを作っているのですが
0533nobodyさん2007/04/01(日) 10:44:05ID:????PLT(12980)
そんな本捨ててしまいなさい
0534nobodyさん2007/04/01(日) 13:23:47ID:???
>>532
・I → printGatePage() → II → loadUserfile()
という流れだと思い込んでるから、自分で確かめても if と elsif を両方通ってると思うだけで。

・何かのフォームからPOST → Iが真 → printGatePage() → exit  # >>532のHTMLを吐いて一旦終了
・続いて「ゆーざーかんり」ページからPOST → 同じスクリプトが叩かれる → Iが偽 → II
…こう動いてるような気はしませんか。
05355292007/04/01(日) 15:33:33ID:uYKSgLT/
>>533さん
本当に捨ててやりたいです
でも独学なのでこの本が一番分かりやすかったんで…

>>534さん
つまり
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
でもう一度同じとこに戻っていることですよね??
ありがとうございました 大変助かりました
0536nobodyさん2007/04/03(火) 16:20:52ID:7w7pj3iq
普通に動くが・・・

use CGI;
foreach (&CGI::param) {
$FORM{$_} = &CGI::param($_) || undef; }

print &CGI::header(-charset=>'Shift_JIS'),
&CGI::start_html(-encoding => 'Shift_JIS');

if(not exists $FORM{'adminpass'}) {
&printGatePage; }
elsif($FORM{'adminpass'} eq 'aaaa') {
&loadUserfile; }
else {
&printErrorPage; }

sub printGatePage {
print <<END;
<h1>ユーザー管理</h1>
<form action="$ENV{'SCRIPT_NAME'}" method="POST">
管理パスワード:<input type="password" name="adminpass"><br>
<input type="submit" value="決定"></form></body></html>
END
exit(0); }
sub loadUserfile {
print 'loadUserfile</body></html>'; exit(0); }
sub printErrorPage {
print 'printErrorPage</body></html>'; exit(0); }
0537nobodyさん2007/04/03(火) 20:04:01ID:Ex+wZs3r
【リダイレクトについて】
LocationヘッダをContent-type:text/htmlを出力した後に
使いたいのですが何か方法はないでしょうか。
0538nobodyさん2007/04/03(火) 20:51:15ID:???
>>537
<q cite="http://www.studyinghttp.net/cgi-bin/rfc.cgi?3875#Sec6.2.2";>
スクリプトはいかなる他のヘッダフィールドも message-body も
返してはならない
</q>
0539nobodyさん2007/04/03(火) 20:52:16ID:???
http://homepage2.nifty.com/~~~/utf8_decode.pll

これなんですが、標準入力をリダイレクションでファイルに変更すると
標準出力されません、なぜでしょうか?
05405392007/04/03(火) 20:53:22ID:???
環境はXPproSP2,ActivePerl-5.8.8.820です。
05415392007/04/03(火) 20:54:01ID:???
失礼しました。下記が正しいです。

http://homepage2.nifty.com/~~~/utf8_decode.pl
0542nobodyさん2007/04/03(火) 21:07:53ID:???
どこでヘッダ吐いてんのさ
05435392007/04/03(火) 21:12:28ID:???
>>542
私への質問でしょうか?
すみません、意味がわかりません。
申し訳ありません。
0544nobodyさん2007/04/03(火) 21:22:35ID:???
CLIだしム板に振ろうかと思ったら、向こうからこっちに来たのか。

Perlについての質問箱 30箱目
http://pc11.2ch.net/test/read.cgi/tech/1173880452/163-178
05455372007/04/03(火) 21:22:59ID:???
>>538
つまりはできないということなのでしょうか?
もしできないのであればCGIにてhtmlを出力した後に
別ページを表示することはMETAタグを使わずには打
開策すらないのでしょうか…。
05465392007/04/03(火) 21:27:10ID:???
>>544
そうです。お願いします
0547nobodyさん2007/04/03(火) 21:49:45ID:???
>>547
はいできません。CGIやHTTPのしくみをよく勉強しましょう。
05485372007/04/03(火) 22:09:15ID:???
>>547
勉強になりました。ありがとうございます。
0549nobodyさん2007/04/04(水) 09:32:06ID:???
もしかしたらどっかのブラウザのバグでできるかもよ、うまくやればドメインを偽って…
0550nobodyさん2007/04/04(水) 14:01:56ID:???
Content-Typeの前にLocationを置くなら>538のすぐ後にある
6.2.4. Client Redirect Response with Document
にできるのかな。
05515392007/04/04(水) 20:34:07ID:???
自己解決しましたよ。

D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではダメで、
perl D:\htdocs\awstats\utf8_decode.pl < T:\Logs\a.txt
ではOKです。
先頭のperlを書きたくなければ、下記らしいです。

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion
\Policies\Explorer
にInheritConsoleHandlesというDWord値を作り1をセット
0552nobodyさん2007/04/04(水) 21:42:58ID:???
とりあえずだ、Perlと関係ないことに気がつこうな
0553nobodyさん2007/04/04(水) 23:16:32ID:???
Perlに関係あるじゃん
とりあえず、正常動作おめ
0554nobodyさん2007/04/05(木) 00:54:13ID:???
OSおよびコマンドラインの話題だなどう考えても
■ このスレッドは過去ログ倉庫に格納されています