【Perl 】初心者コーナーPart7
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい
01/09/12 13:04ID:???1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988809842&ls=50
CGIの質問はこちら【CGIだけど、なんか質問ある?part3】
http://corn.2ch.net/test/read.cgi?bbs=php&key=988727833&ls=50
過去ログ、その他の役立ち情報は>>2-5を見よう。
0669名無しさん@お腹いっぱい。
01/10/08 01:22ID:???0670名無しさん@お腹いっぱい。
01/10/08 01:28ID:???見れないしスレ違いだし良くワカラナイけど
HTTP_REFERERはREMOTE_ADDRとかと違ってクライアント側で容易に書き換え
出来るわけ。
で、多分link.cgiがQUERYをラップして変わりに取りに行ってると思う訳
0671667
01/10/08 01:38ID:???ありがとう
それをコードにするとどうなるでしょう?ってのは、たしかにスレ違いですね
こんなCGI探してますスレッドでもう一回聞いてみます
0672名無しさん@お腹いっぱい。
01/10/08 14:19ID:xLWu69kM方法はどの様なのが定番なのでしょうか?
0673JAPU@勉強中
01/10/08 15:04ID:???m//i 使っても良いと思うが。
0674名無しさん@お腹いっぱい。
01/10/08 18:42ID:???そうなんですか…どうも。
とりあえずContent-Rangeとやらを調べてみます。
0675名無しさん@お腹いっぱい。
01/10/08 20:31ID:Kg6GidGEレスありがとです。
やっぱりindexだといったん大文字か小文字にするしか
無いんですかね?
変換のロスで正規表現の方が早くなったり。
0676名無しさん@お腹いっぱい。
01/10/08 20:50ID:/cLj7636検索対象データのコピーを作って、
そっちをあらかじめ大文字か小文字に統一しとくのは?
ディスクスペースは2倍必要だけど。
0677名無しさん@お腹いっぱい。
01/10/08 21:33ID:???けど検索対象のデータが結構ごちゃごちゃしてるんで
これ以上ファイルが増えるとちょっと(^^;
0678名無しさん@お腹いっぱい。
01/10/08 23:35ID:???検索するたびにそんな多数のファイルを開いてると
I/Oに負担かかって氏ぬです。
↑いまは亡き「とほほラウンジ」方式。
0679名無しさん@お腹いっぱい。
01/10/09 00:28ID:???乱発するとダメ?
0680名無しさん@お腹いっぱい。
01/10/09 01:08ID:qw3TKOks�@掲示板の全てcgiで制御する
�A最近の5件ほどhtmlで表示させてそれ以降(ログの表示)は
cgiで制御する
�B書き込むたびに全てhtmlで出力(ページ数は5ページほど)させる
だと�Aが一番サーバに易しいですかね?
0681名無しさん@お腹いっぱい。
01/10/09 01:56ID:???ん? 聞いた事ないけど、何と比べて?
>>680
HTMLは静的、CGIは動的なコンテンツを提供してるって言えばいい?
一年に3人しか書き込まなくてROMが1000万人居るなら2
リロード代わりに見た人間全員が書き込むんなら1、
3は意味解らん、なら1ページに全部吐けば良いじゃん
0682名無しさん@お腹いっぱい。
01/10/09 02:22ID:???0683名無しさん@お腹いっぱい。
01/10/09 02:23ID:???そんでデータファイルは別に作っといてそれから
htmlファイルとして出力しようと思ったんだけど、
書き込みされるたびにhtmlファイルをすべて作り直すのも負担になるな…と。
だけどアクセスされるたびにcgiで処理する�@は論外かなと
まぁ一番一般的だけど。
んじゃ大抵の人間はログなんか読まないからTOPページだけhtmlで
出力しておくかなと思って。rom率とカキコ率で変わってくるけど
チャットじゃないから最初のページはhtmlにした方が効率が良いかと。
…何をいってるのかわからないと。
処理ごとの負担がデータ化されてるページとかあれば楽なんですけどね。
0684名無しさん@お腹いっぱい。
01/10/09 02:47ID:???カキコのカウントもとればなおよし。
0685名無しさん@お腹いっぱい。
01/10/09 02:57ID:???10年前の超オーバーヘッドなSCSIHDD使ってる鯖でHTML化とか言って
ガリガリファイル書き換えまくったら速攻でディスクビジーだろうし
結局鯖のuptimeと相談しながらってなるでしょ? それを一からやりたいなら
止めないけど・・・
で、頭の良い先人が色々考えた結果ROM比30:1ならHTMLの方が良いだろっつて
アナタが今みてるココとか紅茶板があるんすよ
0686名無しさん@お腹いっぱい。
01/10/09 03:19ID:???こういうの知りたかったんです。為になるです。
>684
そうですね。最初は負荷かかっても損して得とれみたいな
かんじで統計とってみようかなと思います。
まぁ一概にはいえないんでしょうけど→30:1
参考にしようと思います。
0687名無しさん@お腹いっぱい。
01/10/09 13:29ID:???書き出すhtmlのサイズにもよるが。
頻繁にアクセスするファイルはバッファに入るだろうし
0688名無しさん@お腹いっぱい。
01/10/09 14:24ID:???頭大丈夫ですか?
@aiueo = "あいう";
if(@aiueo != 0){
foreach (@aiueo){
print "$_";
}
}
配列aiueoに"123"と"あいう"を格納したいのですが、
二つ目のあいうだけしか表示されません。。。
@aiueo = "あいう";
このようにすると値が上書きされてしまいますね・・・(汗
すいません。
後から加えたい場合は必ず
push @formcheck, $Name; か、
unshift @formcheck, $Name; でやらなきゃいけないんでしょうか?
0691名無しさん@お腹いっぱい。
01/10/09 15:20ID:???pushなりunshiftなりしなさい。
push @array, $str;
# そもそも @array = $str というのはどうかと思うぞ。
0692名無しさん@お腹いっぱい。
01/10/09 15:22ID:???@aiueo = "あいう"; これで'あいう'しか入ってないでしょ?
@aiueo = ("123","あいう");
こうしとけ つーかリファレンス嫁
0694名無しさん@お腹いっぱい。
01/10/09 17:05ID:???<br>
0695名無しさん@お腹いっぱい。
01/10/09 17:06ID:???タグ辞書登録してたらクリックしてもうた〜。すんません。
0696名無しさん@お腹いっぱい。
01/10/09 18:24ID:caK9Qd8A方法ないでしょうか?↓みたいなかんじです。
$bb="$aa";
$aa="ほげ";
print "$bb";
これだと何も出力されませんが
出力が ほげ と出るような方法は無いでしょうか?
0697名無しさん@お腹いっぱい。
01/10/09 18:32ID:???0698名無しさん@お腹いっぱい。
01/10/09 18:35ID:???print $cc;
でもいいっすね。
0699名無しさん@お腹いっぱい。
01/10/09 18:38ID:???$bb='$aa'; #あとこれをシングルクォートに
0700つーか、、
01/10/09 18:38ID:???0702名無しさん@お腹いっぱい。
01/10/09 18:44ID:???$aa="ほげ"; # ここで$aaに「ほげ」代入
print "$bb"; # $bbは空なので、、、
ってこう糞親切?に書くと怒る厨房っているよね
0704名無しさん@お腹いっぱい。
01/10/09 18:51ID:???方法1
$bb='$aa';
$aa='ほげ';
print eval $bb;
方法2
$bb='aa';
$aa='ほげ';
print ${$bb};
0706696
01/10/09 19:06ID:???思とらんかたです。しかもこなにイパーイ!
なるほど!どうもです。
1行目と2行目が逆なのはこの手法を説明する
為だったんで…。これと全く同じというわけじゃないんです。
わかりにずらかったですね。スマソです。
0707名無しさん@お腹いっぱい。
01/10/09 19:07ID:???「文字列の中の変数名」をあとから展開するってどうやってます?
おれはこんなの。
$template = 'hello $name!';
$name = 'ほげ';
print eval '"'.$template.'"';
いちおうこれで動くけど、なんか無駄な気が。。。
0708JAPU@勉強中
01/10/09 19:11ID:???$hoe = "sakura";
$str =~ s/(\$\w+)/$1/eeg;
print "$str\n";
ってのもアリかも。
0709696
01/10/09 19:11ID:???みたいにそのアドレスにはいってるアドレスを参照する
ってのを知りたかったのです。
なんかいつも質問してるな…。ありがとうですです。
0710名無しさん@お腹いっぱい。
01/10/09 19:15ID:???みたいな感じか。
あえてやるなら。
0712名無しさん@お腹いっぱい。
01/10/09 20:01ID:???$aa= $zz;
$zz='hoge';
print eval $bb;
こういうのはできないんですねぇ。
0713名無しさん@お腹いっぱい。
01/10/09 20:04ID:???$aa= '$zz';
$zz='hoge';
print eval $bb;
こうか。どっちにしろできない。
0714名無しさん@お腹いっぱい。
01/10/09 20:08ID:???無理に置換するよりも、最初のままの方がいいんではないか思う。
あと、
eval(qq($template))
って書くと少しカッコイイ(w
0715名無しさん@お腹いっぱい。
01/10/09 21:50ID:???関数のリファレンスについての質問です。
配列やハッシュならよく使っているのですが、関数のリファレンスは
どういうときに便利なのかがいまいち理解できません。
先生、ご指導お願いします。
0716名無しさん@お腹いっぱい。
01/10/09 22:19ID:ac7tHUi6プロバイダの個人HPなので、システム変更の自由はきかないんです。
その上、gzipも使えないので。
やはりCPANのArchive::zipを使えと言う事になるのでしょうか?
0717>715
01/10/09 22:25ID:???&Fnc(\%data, $file);
sub Fnc {
my ($ref_data, $file) = @_;
my $name = $ref_data->{NAME};
my $title = $ref_data->{TITLE};
open(DATA, $file);
.....
}
---例えばクラスを作るとき
sub new {
my $class = shift;
my $self = {};
bless($self, $class);
$self->_initialize();
return $self;
}
sub _initialize {
my $self = shift;
$self->{NAME} = 'hoge';
.....
}
0718711じゃないけど
01/10/09 22:28ID:???置き換えても動作せんよ?漏れがいけないんかな?
0719名無しさん@お腹いっぱい。
01/10/09 22:39ID:rO0MbdjQローカル環境でgzipの展開にCompress::Zlibを使ってます。
ただしUNIXサーバに入れるにはCコンパイラが必要みたいです。
(うちはWindows + ActivePerl + PPMなのでコンパイル不要だった)
0720714
01/10/09 23:38ID:1lvwgexcあれれ?
$needle='This is sample text.';
$template='$needle';
print $template,"\n",eval(qq($template)),"\n";で、
$needle
This is sample text.って出ませんか?
0721714,720
01/10/09 23:39ID:???しかもageちゃったシクーリ
0722名無しさん@お腹いっぱい。
01/10/10 00:19ID:FXDqXQ2wどうすればいいですか?
掲示板はネットで見つかったのですがリンクの制限が見つからなくて困ってます。
0723名無しさん@お腹いっぱい。
01/10/10 00:29ID:???それだとばっちし動作します。けど>>707の最後の一行と
eval(qq($template))を置き換えても動作しないです。
「文字列の中の変数名」をあとから展開
てのはその方法だとできないって事なのかな?
ちなみにeval(qq($template))のqqてのは何なのでしょうか?
0724名無しさん@お腹いっぱい。
01/10/10 00:39ID:???最初にHTTP_REFERERとって特定のURL以外ならlocationで飛ばせばいいんでない?
0725722
01/10/10 00:39ID:FXDqXQ2w0726707
01/10/10 00:54ID:1woNivdAおれも自分で試してみたよん。
eval(qq($template)) では707はうまくいかないっす。
eval(qq("$template")) ならオーケーでした。
結局、このやりかたは評価が2回必要になる(?)ので、
正規表現展開の手間をいれても>>710の人のやりかたが速いです。
Benchmark検証済み。
0727名無しさん@お腹いっぱい。
01/10/10 00:56ID:???my変数が見えない、strict refsでは動かない等の問題があることだけ注意。
0728720
01/10/10 01:08ID:fymnbEUM(´-`).。oO(なんでこんなヘボいミスしたんだろう……)
というわけで、
eval("qq($template)")
が正解です。失礼しました。
qqについては
ttp://flex.ee.uec.ac.jp/texi/perl/perl_136.html
このへん参照するといいと思う。
0729716
01/10/10 08:19ID:OwjZu2K6レスどうもです。そうですか、ドキュメントを未だちゃんと読んでいなかった
のですが、Compress::Zlibはコンパイルが必要ですか。プロバのHPなので
それも出来なくてちと悲しいです。
0730名無しさん@お腹いっぱい。
01/10/10 11:46ID:???コンパイルもやろうと思えば出来ますよ。
0731名無しさん@お腹いっぱい。
01/10/10 14:09ID:29gVd4os送信したいんですが、どのように受け渡せばいいのでしょう?
$ua->cookie_jar($cookies);
みたいに格納できるメソッドがあるのですか?
0732名無しさん@お腹いっぱい。
01/10/10 14:48ID:???CGIで読みこんだりとかできるの?それでパスクラックできねえかな。
0733名無しさん@お腹いっぱい。
01/10/10 14:56ID:???0734名無しさん@お腹いっぱい。
01/10/10 14:58ID:???0735名無しさん@お腹いっぱい。
01/10/10 16:22ID:2.AeAxdcPOST用のデータはRequestのほうに入れとく。
my $req = HTTP::Request->new(POST => $url);
$req->content('name=hoge&text=hoge');
もしデータ内に日本語などがある場合は
use HTTP::Request::Common;
$req = HTTP::Request::Common::POST($url, [name='ほげ',text='ふが']);
を使うと、自動的にエスケープしてくれて楽。
0736名無しさん@お腹いっぱい。
01/10/10 16:25ID:???0737名無しさん@お腹いっぱい。
01/10/10 16:28ID:???0738名無しさん@お腹いっぱい。
01/10/10 16:46ID:???ありがとうございます。
調べてみたら
$hd = HTTP::Headers->new;
foreach $key ( keys %FORM ){
$hd->push_header( $key -> $FORM{$key} );
}
$req = HTTP::Request->new( 'POST', $url, $hd );
でもいけそうな感じだったので試してみます。
というかPOSTで渡す内容が不特定なので
[name=>'ほげ', text=>'ふげ']
だと無理ですかね。
0739731
01/10/10 18:23ID:???うう、 $hd->push_header ではうまくいきませんでした。
>>735 さんの方法で上手くできるんでしょうが、不特定多数の
要素を送る必要があるのでこの方法は使えないし…。
すいません、不特定多数の要素を POSTとして送る方法を
教えていただけないでしょうか。
0740名無しさん@お腹いっぱい。
01/10/10 19:04ID:???0741740
01/10/10 19:06ID:???my $req = HTTP::Request::Common::POST($url, \%FORM);
0742名無しさん@お腹いっぱい。
01/10/10 19:37ID:???うまく動いてくれません。
何が足りないのか教えてください。
sub foo()
{
sub _getstr($)
{
my ($str) = @_;
return $str . "だよ\n";
}
my ($str) = _getstr("てきとー");
print $str;
}
sub foo2()
{
sub _getstr($)
{
my ($str) = @_;
return $str . "だもん\n";
}
my ($str) = _getstr("てきとー");
print $str;
}
&foo();
&foo2();
0743名無しさん@お腹いっぱい。
01/10/10 20:05ID:0t.5n9Msそれじゃ_getstrが局所的な関数定義になってないです。
Perlは基本的に、どこで定義してもグローバル関数(笑
2つの_getsrtを別々の名前空間で定義すればオーケ。
sub foo() { package foo; sub _getstr() 以下略 }
sub foo2() { package foo2; sub _getstr() 以下略 }
0744名無しさん@お腹いっぱい。
01/10/10 20:27ID:???どうもありがとうございます。
my宣言とかできるかちょっと期待したのですが、
これは、packageの方も少し試してみて、
内部関数名を変えるかpackage使うか決めたいと思います。
(関数内でpackage書けるの知りませんでした。どうもです)
0745名無しさん@お腹いっぱい。
01/10/10 20:42ID:???0746名無しさん@お腹いっぱい。
01/10/10 20:56ID:???local *foo = sub{ hogehoge };
my $foo = sub{ hogehoge };
#とすれば良いのではないかな?
0747名無しさん@お腹いっぱい。
01/10/10 22:41ID:???それがほんとのローカル関数ですね。
743みたいなのは外から&foo::_getstr()でアクセスできるし。
0748名無しさん@お腹いっぱい。
01/10/10 23:55ID:???なるほど! ありがとうございます。
0749名無しさん@お腹いっぱい。
01/10/11 11:44ID:???なるほど。こんな感じですね。
どうもありがとうございます。
sub foo()
{
my $_getstr = sub($)
{
my ($str) = @_;
return $str . "だよ\n";
};
my ($str) = $_getstr->("てきとー");
print $str;
}
プロトタイプに注意。
#!/usr/bin/perl
sub PrintScalar($){ print shift, "\n" }
BEGIN{
*PrintScalar2 = \&PrintScalar;
$PrintScalar3 = \&PrintScalar;
}
*PrintScalar4 = \&PrintScalar;
$PrintScalar5 = \&PrintScalar;
my @hoge = qw(foo bar);
PrintScalar (@hoge);
PrintScalar2 (@hoge);
$PrintScalar3->(@hoge);
PrintScalar4 (@hoge);
$PrintScalar5->(@hoge);
PrintScalar6 (@hoge);
BEGIN{
*PrintScalar6 = \&PrintScalar;
}
__END__
0751名無しさん@お腹いっぱい。
01/10/11 16:48ID:kMiBAPJ6えーと、「プロトタイプを有効にするには、BEGINブロックの中で
エリアスを作るしかない」つーことですか?
あ。念のため今perldoc perlsub見たら、そう明記されてたっす。
知らなかったー。プロトタイプあんま使わないから。
要するにプロトタイプ付きの「ローカル関数」は作れないってことなのか。
0752751
01/10/11 16:51ID:???0753名無しさん@お腹いっぱい。
01/10/11 20:27ID:???なんかサンプル見るとtry〜catch構文とか作ってて
いろんな意味でスゲーんですけど。
俺は一生プロトタイプ'&'を自分で使うことはあるまい。
0754nullsann
01/10/11 23:27ID:S31Vh/vQファイルロックは一度で良いんでしょうか?
sub filecheck{
&lock;#
open IN,"$logfile";
#syori
close IN;
open FP,"> $logfile"
#syori
close FP;
.
.
.
.
&unlock;
}
mkdirのロック方式使ってるんですが・・・。
0755名無しさん@お腹いっぱい。
01/10/12 00:30ID:???一度でよし。
0756名無しさん@お腹いっぱい。
01/10/12 01:31ID:kGkVgeeAif ($ENV{'HTTP_REFERER'} ne 'http://許可する.com') {
print "Location: http://ばいばい.com\n";
print "\n";
}
にしたのですが、閲覧を許可する参照元をもう一つ増やすにはどうしたらいいですか?
if ($ENV{'HTTP_REFERER'} ne 'http://URL1'|'http://URL2')
だとうまくいきませんでした
0757名無しさん@お腹いっぱい。
01/10/12 01:54ID:???許可するのが2つぐらいなら
「URL1ではなく、URL2でもなければ、ばいばい」というふうに
素直にコーディングするといいです。
if ($ENV{略} ne 'URL1' and $ENV{略} ne 'URL2') {
・・・
}
0758名無しさん@お腹いっぱい。
01/10/12 10:18ID:UFajsOUw根本的に違うのでしょうか?お教えください。
#!/usr/local/bin/perl
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><TITLE>CGIテスト</TITLE></HEAD>\n";
print "<BODY>\n";
#
print "<form name="form1" method="post" action="">\n";
print "<input type="checkbox" name="checkbox" value="checkbox">\n";
print "</form>";
#
print "</BODY>\n";
print "</HTML>\n";
__END__
0759名無しさん@MZ-2000
01/10/12 10:21ID:???とりあえず
print "<form name="form1" method="post" action="">\n";
print "<input type="checkbox" name="checkbox" value="checkbox">\n";
この二行がだめ。
0760名無しさん@お腹いっぱい。
01/10/12 10:24ID:???0761名無しさん@お腹いっぱい。
01/10/12 10:39ID:DN2jVK/o0762名無しさん@お腹いっぱい。
01/10/12 11:11ID:VXGFJvh.print "<input type="checkbox\" name=\"checkbox\" value=\"checkbox\">\n";
だね。
0763名無しさん@お腹いっぱい。
01/10/12 11:16ID:VXGFJvh.print "<input type=\"checkbox\" name=\"checkbox\" value=\"checkbox\">\n";
鬱だ。
0764名無しさん@お腹いっぱい。
01/10/12 11:20ID:???0765名無しさん@お腹いっぱい。
01/10/12 11:39ID:???qq{<input type="checkbox" name="checkbox" value="checkbox">\n};
まぁ>>758、お前はマトモな本で基礎を勉強してから出なおしなさいってこった。
0766名無しさん@お腹いっぱい。
01/10/12 11:43ID:uPcFyHO2ロジックを1行に書くのって頭が混乱しない?
効率悪いかも知れないけど、こんな関数を作るほうがいいと思う。
if (! &is_good_referer()) {
:
}
sub is_good_referer {
my @kyoka = ('URL1', 'URL2');
foreach my $url (@kyoka) {
if ($ENV{HTTP_REFERER} eq $url) {
return 1; # 許可するURLのどれかに一致すれば1を返す
}
}
return 0; # どれにも一致しなければ0を返す
}
0767業
01/10/12 11:57ID:e.iu2Egsただ、空白2文字はちょっとな。4文字は欲しい。
0768名無しさん@お腹いっぱい。
01/10/12 12:13ID:Qk0xmYmc扱いができないのでしょうか?
cgiとして動かすか、実行形式にするしかないのですか?
■ このスレッドは過去ログ倉庫に格納されています