Perl 初心者コーナー Part21
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
03/03/18 18:47ID:Dujz7IUF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
1:自分はこう言う事がしたい。
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 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
過去ログやお勧めサイトは >>2-10
0238236
03/03/28 10:12ID:???Cookieの有無を調べて、abcというクッキーがなければよそに飛ばしたいのです。
#1 #!/usr/bin/perl
#2 use strict;&main;exit;
#3 sub main{
#4 my $id = "abc";
#5 my %cook = ();
#6 getcookie("abc",\%cook);
#7 print "Content-Type: text/plain\n\n";
#8 print "a:$cook{'a'}\n";
#9 print "b:$cook{'b'}\n";}
#10 sub getcookie{
#11 my ($id,$cook) = @_;
#12 my %cook = ();
#13 my $cookie = $ENV{"HTTP_COOKIE"};
#14 $cookie =~ tr/+/ /;
#15 $cookie =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2',$1)/eg;
#16 foreach my $x (split ";",$cookie){ my ($key,$value) = split "=",$x,2;
#17 $key =~ tr/ //d;
#18 $cook{$key} = $value;}
#19 foreach my $x (split ",",$cook{$id}){ my ($key,$value) = split ":",$x,2;
#20 $$cook{$key} = $value;}
#21 }
#13行目に my $cookie = if($ENV{'HTTP_COOKIE'},'abc' ) < 0 ){
print "Location:http://www.hoge.com/\n"; }
とでも書けば良いのでしょうか? それとも全然違う行に全然違う事を書けば良いのでしょうか?
何にしても初心者の私にはこれ以上は難しいでとても困っています。
どうか救いの手をお願いできないでしょうか?
0239236
03/03/28 10:15ID:???0240nobodyさん
03/03/28 10:18ID:???CGI側ではブラウザを閉じたことを判別できないので、無理です。
JavaScriptを併用すれば可能かもしれない。が、これ以上はスレ違い。
0241nobodyさん
03/03/28 10:18ID:???ありがとう御座います。
いいですねえ、こんなの。もっとシンプルに1っ子だけしか送れないやつでも良いんですけどね・
ええっと・・・・・そのですねえ・・・プログラムが置いてあるところが知りたいんですけど・・・・
すみませんが・・・・よろしくおねがいします・・・・・・
0243nobodyさん
03/03/28 10:30ID:???0244227
03/03/28 11:40ID:???お邪魔しました。m(_ _)m
0245236
03/03/28 11:42ID:???#8 print "a:$cook{'a'}\n";
#9 print "b:$cook{'b'}\n";}は
#8 print "abc$cook{'abc'}\n";でした。<(_ _)>
0246nobodyさん
03/03/28 16:44ID:I24HmqWVこれは一体なんの意味があるんでしょうか。
0247kyo
03/03/28 17:25ID:b4ccXG3wどこか分かりやすい解説が載っているサイト知りませんか?
0248nobodyさん
03/03/28 17:29ID:???ログファイルに「スレ文」か「レス文」かを分けるなんらかの目印を入れる。
読み出しの時はその目印でレスかスレかの処理を分ける。以上。
他には書きようがない。
他人のBBSでも眺めれば?
0249nobodyさん
03/03/28 18:02ID:???apple,青森,40
orange,愛媛,20
strawberry,茨城,30
↑これがそれぞれ
@fluit = ('appe','orange','strawberry');
@from = ('青森','愛媛','茨城');
@price = (40,20,30);
こんな感じに配列に入ってるとき、たとえば下のようにすると、、、、
foreach (sort { ($price[$b] <=> $price[$a]) || ($a cmp $b) } 0 .. $#price) {
print "$fluit[$_],$from[$_],$price[$_]\n";
}
apple,青森,40
strawberry,茨城,30
orange,愛媛,20
↑こうなると思うんですが、
ソートする条件をフォームから指定させたいんです。
たとえば、($FORM{'jyouken'} eq "fluit")ならfluitでソートって感じに・・・
どのようにすればいいでしょうか?(説明へたですいません)
0250nobodyさん
03/03/28 18:03ID:???0251nobodyさん
03/03/28 18:45ID:???構造がだめっぽ 自分ならこうする
@data= (
{fluit=>'apple',from=>'青森',price=>40},
{fluit=>'orenge',from=>'愛媛',price=>20},
{fluit=>'strawberry',from=>'茨城',price=>30}
);
@data = @data[sort{$data[$a]->{$FORM{select}} cmp $data[$b]->{$FORM{select}] } 0 ..$#data];
for (0 .. $#data) {
print "$data[$_]->{fluit},$data[$_]->{from},$data[$_]->{price}\n";
}
0252nobodyさん
03/03/28 18:52ID:???えっと、恥ずかしながら
@data= (
{fluit=>'apple',from=>'青森',price=>40},
{fluit=>'orenge',from=>'愛媛',price=>20},
{fluit=>'strawberry',from=>'茨城',price=>30}
);
これははじめて見たんで、何をしてるのか・・・調べてきます。
できれば弄るところが多くなると思うんで、そのままの構造でいきたいんですが、、、
02534
03/03/28 19:08ID:JsShpJ/5扱っているのだと思います。違ってたらスマソ。
俺もこういうのちょっとガンバロ・・
0254249
03/03/28 19:19ID:???↓
}} } 0 ..$#data];
こうですね。動作確認できました。
しかし、なにをやってるか調べてもわからないので、
どう組み込んだらいいのか・・・
この解説ページないですかねぇ
02554 ◆oIfBpVov3.
03/03/28 19:32ID:JsShpJ/5これ
0257nobodyさん
03/03/28 20:35ID:???テンプレートファイルに特定の変数値を流し込むための目印みたいなもん。
s/%%HOGE%%/$hoge_value/;
で、変換しているとか。
0258lanble
03/03/28 20:38ID:iBaRMkHHtext:<head><title>タイトルン</title></head>
があるばあい「タイトルン」だけに変更して表現するときはどうすれば
いいですか?あと
text:<head><title>titlen</title></head>
のtitlenにもマッチさせたいのですが、これらを正規表記一行で表現すると
どうゆうふうになるのですか?
0260nobodyさん
03/03/28 21:25ID:???http://www.din.or.jp/~ohzaki/regex.htm
これ読んでそれでもわからなかったら、
今度は正規表現のスレに行け。
0261nobodyさん
03/03/29 00:45ID:fHpTV+Jc初歩的な質問かもしれないですが・・・・・・・
パスワード制限するページで、
IDとパスワードでアクセス制限
(Basic認証でなく、<form>タグ内と<input tyle= text と passworsで)
して、ページを、
Apacheとperl5の環境でやりたいのですが、
どういう方法があるのでしょうか?
●<input type=hidden>で変数をやりとりする
●クッキーを使う
は知っているのですが、
これしか方法はないのでしょうか?
0262nobodyさん
03/03/29 01:01ID:8vJPU8locgiで以下のを実行させるとフレームが5個くらいできるのだけど
なぜですか?
#! /usr/bin/perl
test();
sub test{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head><title>testdesu</title></head>
<frameset cols="50%, 50%">
<frame name="t2"
src="$ENV{'SCRIPT_NAME'}?frame=test2">
<frame name="t3"
src="$ENV{'SCRIPT_NAME'}?frame=test3">
<noframes>
<p>このページはフレームをサポートしているブラウザで利用する必要があります</p>
</noframes>
</frameset>
</html>
END
}
0265nobodyさん
03/03/29 01:48ID:8vJPU8loなぜ6個でどういう動作しているのでしょうか?
#! /usr/bin/perl
if($FORM{'frame'} eq 'test2'){hidari();}
elsif($FORM{'frame'} eq 'test3'){migi();}
else{test();}
exit;
sub test{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html><head><title>test</title></head>
<frameset cols="50%, 50%">
<frame name="t2" src="$ENV{'SCRIPT_NAME'}?frame=test2">
<frame name="t3" src="$ENV{'SCRIPT_NAME'}?frame=test3">
</frameset></html>
END}
sub hidari{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>test2</title></head><body>test hidari</body></html>
END}
sub migi{
print <<END;
Content-type: text/html; charset=Shift_JIS
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>test3</title></head><body>test migi</body></html>
END}
0266bloom
03/03/29 01:55ID:i2vNq3FD0268nobodyさん
03/03/29 02:43ID:wFiuyLe9よく考えてから質問してくれ
0270nobodyさん
03/03/29 09:39ID:???0271nobodyさん
03/03/29 13:11ID:???後のことは知らんが。
0272nobodyさん
03/03/29 13:35ID:???通信がセキュアであることを判定するようなメソッドが欲しいと思い、
いろいろ環境変数などを探してみたのですが、ぜんぜん見付かりません。
どうやったら確実に判別できるのでしょうか。
もしかして、「https://から始まっていたらセキュア通信!」みたいにすればOKですか?
0273nobodyさん
03/03/29 14:06ID:???isSecua() メソッドとは何をもって通信がセキュアであると判断するんだ?
あと、どこまでのセキュリティレベルを必要としてるんだ?自分で理解してるのか?
それに環境変数ごときで判断して良いなら SSL_* 変数をチェックすりゃ十分だろうし、
https:// から、なんてレベルなら SERVER_PORT でも見りゃいーじゃん。
Perl と関係ねーじゃん。よそ逝け。
0274nobodyさん
03/03/29 15:06ID:GyYYsUNOそげなこといわんと、実装方法教えてくんろ。
0276nobodyさん
03/03/29 19:16ID:???何をもってセキュアだとするのか、定義を決めなければ実装もできんだろうが。
自分がやることやらないで他人に頼ろうとするな。
0277nobodyさん
03/03/29 20:46ID:rt7Ytb+z$value = jcode::sjis($value);と記述しています。
同じことをEncodeモジュールで行うには
どういう風に書き換えたらいいのでしょうか。
一応グーグル検索して
http://www.cise.ufl.edu/depot/www/perl/pod/perljp.html
などを読んでみたのですが、よく分からなかったです;
すみません。
0278nobodyさん
03/03/29 20:59ID:NU31LA3c>ネット上のページを取得するのに、LWP::Simpleとwgetを使う方法があるとのことで、
>それぞれで実際に取得するところまで漕ぎ着けました。
どうやるの??
0280nobodyさん
03/03/29 22:17ID:NU31LA3carigatou
0281nobodyさん
03/03/29 23:42ID:NU31LA3c#!/usr/local/bin/perl
use LWP::Simple;
my $url = "http://www.google.com";
my $content = get($url);
print $content;
exit(0);
ってのをアップしたんだけど500になってしまいます。
なんでだろう。
0282nobodyさん
03/03/29 23:53ID:???LWPが使えないから。
tu-ka,テストはローカルでやれ。
0284nobodyさん
03/03/29 23:56ID:???何でだろうも糞も無い。
0285nobodyさん
03/03/30 00:01ID:???0286nobodyさん
03/03/30 00:15ID:???0289nobodyさん
03/03/30 00:21ID:???500エラーって事はHTTP経由だろ?なら要るだろうが。
>>285
#! /usr/local/bin/perl
print 'Content-Type: text/html', "\n\n";
eval {
require LWP::Simple;
};
if ( $! ) {
print $!
} else {
print 'OK'
}
0291nobodyさん
03/03/30 00:54ID:???ないから使えないだけなのと、自分で置いても使えないのと。
0293nobodyさん
03/03/30 03:20ID:DsnrZpx8なんですけど、すごく遅くて困ってます。
他のマシンでやると速いんですが、自マシンでやると遅いです。
スペック的には一番速いんですが。なんででしょうか?
ご教示ください。お願いします。
0296nobodyさん
03/03/30 04:10ID:???春厨の季節でつね
0297nobodyさん
03/03/30 04:11ID:???なんでも春のせいにする厨房の季節でつね
0298nobodyさん
03/03/30 04:16ID:???「なんでも春のせいにする」と「特定の現象を春厨のせいにする」の違いが分からない厨の季節でつね。
0300299
03/03/30 04:46ID:???特定の現象とはどの現象を指しているの?
0301nobodyさん
03/03/30 05:26ID:C4JPPs9nPerlで掲示板を作り、携帯からそれを利用できるようにしました。
するとauの携帯から書き込む際に
cgi-lib.pl:
Unknown
Content-type:
application/x-www-form-urlencoded;
charset=shift_jis
というエラーが出ます。この原因(とできれば解決法)を
一言でいいのでどなたか教えてください。
パソコンとi-modeからはちゃんと書き込めるんですけど…。
0302nobodyさん
03/03/30 05:48ID:pEUiOEbB結構巨大なcgiとかになってくるとサブルーチンからサブルーチンとか
ピョンピョン跳び回って、なかなか変数や配列の後を追えないと言うか
今、ココに格納されるべき変数は・・え〜っと何だっけ?アレ?
ってな具合になってしまいます。サブルーチンの引数の中にサブルーチンが
含まれててその引数にまたサブルーチンが・・見たいなことになるとマジで
混乱してしまいます。
何か良い方法はないでしょうか?
0303nobodyさん
03/03/30 05:56ID:???0304302
03/03/30 07:12ID:???使わせて貰ってます。変数エクスプローラーってのがあってサブルーチンや
各変数にピョンピョン飛べるのが凄く助かります。
0306nobodyさん
03/03/30 11:31ID:???0307nobodyさん
03/03/30 11:40ID:???http://www.au.kddi.com/ezfactory/tec/index.html
嫁。
0308nobodyさん
03/03/30 16:51ID:???306 :nobodyさん :03/03/30 11:31 ID:[ コレ ]
こういう風に、毎回IPが一緒とは限らない実行側を
どのように判断して毎回同じIDを与えているのでしょうか?
判断材料としてはやっぱり IP、HOST、ブラウザなんかを読んで判定してるんでしょうか?
質問へぼくてすみません。
0309nobodyさん
03/03/30 16:57ID:???0310nobodyさん
03/03/30 17:34ID:???0311nobodyさん
03/03/30 18:20ID:???Perlと何の関係が?
そのうち「Perl初心者な者ですがハヤシライスの作り方について質問です」なんていう
質問が来そうで鬱だ。
0312nobodyさん
03/03/30 18:30ID:???#! /usr/local/bin/perl
print "Content-Type: text/html\n\n";
print 'ハヤシライス';
exit;
0313nobodyさん
03/03/30 18:36ID:???それなら
#! /usr/local/bin/perl
print "Content-Type: text/plain\n\n";
print 'ハヤシライス';
exit;
だろうよ。
0314nobodyさん
03/03/30 20:04ID:lN4HiIUc0315nobodyさん
03/03/30 20:18ID:lN4HiIUc「値に改行コードを含む CSV形式を扱う」
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
を使ってみたのですが、
結果、改行を含むセルが、2行として分析されてしまいます。どうすればいいのでしょうか?
■csvファイルは、以下の通りです。
a,1,2,"あああ
いいい",かかか
あ,2839,sw,5,6
■cgiの実行結果は以下の通りです
a12"あああ<br>
いいい"かかか<br>
あ2839sw56<br>
■スクリプトは以下の通りです。
open (IN,"read_csv.csv") or die;
while (my $line = <IN>) {
$line .= <DATA> while ($line =~ tr/"// % 2 and !eof(DATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
# @values を処理する
foreach $column (@values){
&jcode::convert(\$column, "sjis");
print $column;
}
print "<br>";
}
close IN;
0318315
03/03/30 21:24ID:oGZ4ZySMPerlメモにある排他制御を使いたいのですが
(http://www.din.or.jp/~ohzaki/perl.htm#File_Lock)
とりあえず中身がどういう仕組みかわからないながらもとりあえず使いたいのですが、
使用方法がわかりません。。。。
# ロックする(タイムアウトあり)
$lfh = my_flock() or die 'Busy!';
# アンロックする
my_funlock($lfh);
とあるのですが、具体的に、
たとえば、./log/bbslog.txt にロック/アンロックするには、どういう書式にすればいいのでしょう
0319nobodyさん
03/03/30 21:34ID:???いや、仕組みを知るのが先だろう。
こちらのスレが参考になるかも。↓
http://pc2.2ch.net/test/read.cgi/php/1024795138/l50
0321nobodyさん
03/03/30 23:58ID:???http://search.cpan.jp/
ここなんかどうでしょ
で、私の質問ですが、
multipart/form-dataでデータを受け取って
CGI..PMでアップロードしようとしています。
で、
use CGI;
my $cgi = CGI->new;
こうした時点で/cgi-bin(実行path)にtmpファイルが作成されるのですが
これを回避することってできるんでしょうか?
あるいはせめてtmpファイル作成場所の指定をしたいわけです。
ご存知の方教えてください。
0323321
03/03/31 01:15ID:???それやってみましたがダメでした。
あと環境変数TMPDIRを見るようなので
値を設定しましたがダメでした。
http://member.nifty.ne.jp/hippo2000/perltips/Cgi.htm
-private_tempfiles
回避策としてFHをcloseしてやるとtmpファイルは消されました。
結局出力先指定は上手くいきませんでしたが・・。
0324nobodyさん
03/03/31 02:28ID:U3RJ6jN1UNIX環境で云々と書いているので、UNIXなんですかね。WindowsにActive Perlとhttpadじゃだめですか?
0325nobodyさん
03/03/31 02:36ID:???0326nobodyさん
03/03/31 02:48ID:poa5fGTP0328p0604-ip02sasajima.aichi.ocn.ne.jp
03/03/31 05:14ID:E9hS93FY0329nobodyさん
03/03/31 06:04ID:???自分が初心者で、これからPerlをやっていこうとしてて、
使えるサーバスペースがWindowsしかないのなら、とりあえず
UNIXのサーバを借りた方が勉強楽だと思うよ。
0331nobodyさん
03/03/31 06:24ID:???0332nobodyさん
03/03/31 06:33ID:???0333nobodyさん
03/03/31 07:03ID:z41dsEAY将来どこまでやる必要があるかによる。
素人が遊びでやるならWindows+AnHttpd+ActivePerlが簡単でいい。
情報も集めやすいし。
将来、顧客に提供するWebサイトを目標にするなら、すくなくとも
Windowsは避ける。定番のUnix+Apache+Perl だろうね。
敷居が低いからと言ってWindowsを採用すると、保守できないシステム
になり、無理やり保守しようとしてとんでもない人件費がかかったりします。
■ このスレッドは過去ログ倉庫に格納されています