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
0511nobodyさん
03/04/03 10:24ID:???%hash = (a => 1, b => 2);
$hash = {a => 1, b => 2};
この2つの状態を比べると、データは同じでも、上の方は、%hashっていう名前が
付いているのに対して、下は、データのアドレスが$hashに入ってる。
つまり、1つの変数にメモリ上のデータが対応している状態を、普通の状態。
変数に対応していないデータの事を、無名だ。という。
0512nobodyさん
03/04/03 10:28ID:???5行目を修正。。
0513nobodyさん
03/04/03 10:31ID:???$str = 'hoge';
$ref->{a}[0]->($str)->$str->$str($str->$str);
0515nobodyさん
03/04/03 12:13ID:???はぁ?
0516251
03/04/03 12:22ID:???例えば、xが2yが3の領域の値を見たい時は
print $area[2]->[3];
あと、xyzの値を登録したい時は
$point[1]->[2]->[3] = 'fujiyama';
こんなふうに呼び出すとか・・・
んで、無名配列はリファレンスの概念を理解すると解り良いと思う
perlだと
配列は @ayaya0 =(1,2,3)
ハッシュは %ayaya1 = (a=>1,b=>2);
で表記出来るのだけど
リファレンスは
$ayaya2 =[1,2,3];
$ayaya3 ={a=>1,b=>2};
や、
$ayaya2 = \@ayaya0;
$ayaya3 = \%ayaya1;
0517251
03/04/03 12:22ID:???$ayaya自体にはデータが格納されている位置情報が入ってる。
だから、データーが巨大でもその位置情報をわたすだけで済むので処理が高速化出来るとかいわれてる。(ソース次第だけね・・・)
んで、呼び出しは
$ayaya0[0]
$ayaya1{a}
ってなることはperl初心者でもわかると思うけど、 リファレンスを参照する場合は
$ayaya2->[0]
$ayaya3->{a}
となる。要は$ayayaだけでは必要とする要素をいままでのままでは書けないから->を使って記述しましょうということです。
オマケで、リファレンスを配列構造やハッシュに戻す時は
@ayaya0 = @{$ayaya2};
%ayaya1 = @{$ayaya3};
まぁ、ルールとしてはこうなんだけどアロー演算子自体が省略可能・・・
$hoe->{a}->[3] なら $hoe->{a}[3] とか
でも
$hoe{a}[3]はこの場合だとNG 何故なら %hoeの aというkeyを参照してしまう為
$hoe{a}->[3] と解釈されてしまう・・・
気をつけなければならない所が多いため最初のうちは演算子等はしっかり付けとくほうがいいと思われ。
で、ココまではハードリファレンスの話、OO思考プログラムはまたルールが違うのでそれは別の話に・・・
0518251
03/04/03 12:36ID:???だったすまね・・・
0519457
03/04/03 13:46ID:???open INPUT, "<ip.txt";
if($_ = /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
&START;
}
else($_ = /close/){
&CLOSE;
}
sub START
{
print "content-type: text/html\n\n";
print "<html><head><title>公開中</title></head>\n";
print "<body><a href=\"jump.cgi\">公開中</a></body>\n";
print "</html>\n";
}
sub CLOSE
{
print "content-type: text/html\n\n";
print "<html><head><title>閉鎖中</title></head>\n";
print "<body>閉鎖中</body>\n";
print "</html>\n";
}
これだと、Perlチェックでelseの部分がおかしいって出るので、ぜんぜんわからないので、
↓にかえました。
0520457
03/04/03 13:47ID:???open INPUT, "<ip.txt";
if($_==/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
&START;
}
if($_!=/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
&CLOSE;
}
sub START
{
print "content-type: text/html\n\n";
print "<html><head><title>公開中</title></head>\n";
print "<body><a href=\"jump.cgi\">公開中</a></body>\n";
print "</html>\n";
}
sub CLOSE
{
print "content-type: text/html\n\n";
print "<html><head><title>閉鎖中</title></head>\n";
print "<body>閉鎖中</body>\n";
print "</html>\n";
}
こうしたんですけど、if文でifが複数あってelseがないっていうのは文法上だめですか?
0521502
03/04/03 13:52ID:???質問しっぱなしで寝まくってました。
で、今ざっと皆さんのレス読み返してるんですが、
>>517さんの一行目でなんとなくメリットがわかりました。
つまり、一旦新たな配列に値をコピーしてからサブルーチンなんかにわたすより、
値の入ってるアドレスを渡した方が、効率的ってことですね?
で、矢印演算子はそれらの代入や参照のときに使うものだと
今からもう一度皆さんに書いていただいたのを読み直してみます。
本当に有難うございます。多分理解できると思います
0522nobodyさん
03/04/03 13:53ID:???0525nobodyさん
03/04/03 14:07ID:???仕様をはっきりさせないから。
ip.txtって複数のアドレスが入ってるの?その場合はデリミタは?
それとも一つあるか、空のファイルのどちらか?
あるいはアドレス以外の何かも含まれているの?
0526nobodyさん
03/04/03 14:45ID:???とか、まぜっかえしてみる。
0528nobodyさん
03/04/03 15:33ID:kftTqlDWhttp://my.vector.co.jp/servlet/System.FileDownload/download/ftp/0/279026/pack/win95/game/table/pachinko/sikisai.lzh
0529nobodyさん
03/04/03 15:56ID:jWA2mxiHhttp://bbs.1oku.com/bbs/bbs.phtml?id=yasuko
0530nobodyさん
03/04/03 16:06ID:???0531CGIでwww上のhtmlソースを取得
03/04/03 16:08ID:507cBmxswww.kasai.fm/perlHTTP/
www.antun.net/tips/cgi/perl.html
tohoho.wakusei.ne.jp/wwwperl2.htm#socket
上記のサイトの通りにCGIを設置しても動いてくれません。
どなたか幅広い環境で動くコードをお持ちでしたら
いただけないでしょうか?
これがどうしても出来なくてもう一週間も製作が止まった
ままになって参ってます、大変ずうずうしいお願いでは
ありますがどうか宜しくお願い致します。m(_ _;)m
0532nobodyさん
03/04/03 16:10ID:+bF3BpEY0chのスクリプトをDLして掲示板を精製したけどその掲示板にアクセスするには何処にアクセスすればいいのですか〜?
(他のサイトではindex.htmlでアクセスしてたが
0533nobodyさん
03/04/03 16:11ID:???自分のコンピュータでやればうまくゆくと思う。
0536nobodyさん
03/04/03 16:13ID:???それそれ。
>>527
ということでhogehoge.cgiというファイルの出力で
print "Content-Type: text/javascript\n\n";
print "document.write(\"$hogehoge");\n";
とかしておいて、
HTMLファイルに
<script type="text/javascript" src="hogehoge.cgi"></script>
と書くと$hogehogeの内容が出てくる。
0537nobodyさん
03/04/03 16:35ID:sUO6GuNu${$hoge} = 'abc';
0538531 CGIでwww上のhtmlソースを取得
03/04/03 16:37ID:507cBmxsそれが..
他人が作ったCGIはちゃんとこの動作を
してるのに自分のは動かないんです...
トクトクサーバのOSはLinuxなのでWINDOWSやUNIXサーバ用に
書かれたコードは動かないんでしょうか..
0539nobodyさん
03/04/03 16:41ID:jWA2mxiH◆よろしく◆
0542537
03/04/03 16:54ID:sUO6GuNu${$hoge} = 'abc';
このような代入の動作は、
$hogeの中身の文字列と同じ名前をもつスカラ変数に 'abc' という文字列を代入する。
$hogeの中身であるスカラへのリファレンスが指している変数に、'abc' という文字列を代入する。
のどちらかが、場合場合で行われる、ということでしょうか。
0543457
03/04/03 16:56ID:???ip.txtには公開状態にしたいときに、1つのIPアドレスが書き込まれています。
閉鎖時は「close」という単語が書かれています。(空ファイルはなんか不安なもので)
それで、一から自分で書き直したのがこれです。
0544457
03/04/03 16:56ID:???open(FILE, "ip.txt");
while (<FILE>) {
if (/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/){
&connection;
}else{
&unconnection;
}
}
close(FILE);
sub connection
{
print "content-type: text/html\n\n";
print "<html><head><title>公開</title></head>\n";
print "<body><h1>公開</h1></body>\n";
print "</html>\n";
exit;
}
sub unconnection
{
print "content-type: text/html\n\n";
print "<html><head><title>非公開</title></head>\n";
print "<body><h1>非公開</h1></body>\n";
print "</html>\n";
exit;
}
なんとなく理解できるんですが、whileの中にifを入れないとできないのがよくわかりません。
if(<FILE> =/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
とかだめでしょうか?whileは絶対いるのでしょうか?
0545531 CGIでwww上のhtmlソースを取得
03/04/03 16:59ID:507cBmxsいえ、socketは使えるんです。
http://www.vector.co.jp/soft/unix/net/se220625.html
これを設置したらちゃんと動きますから..
(HP一括ダウンロードCGIです)
このCGIのソースを参考にさせてもらおうとも
思ったのですがあまりに複雑なコードなので,,,
0547457
03/04/03 17:07ID:???open FILE, "ip.txt";
$data = <FILE>;
close FILE;
if($data == "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/"){
&connection;
}else{
&unconnection;
}
sub connection
{
print "content-type: text/html\n\n";
print "<html><head><title>公開中</title></head>\n";
print "<body><a href=\"jump.cgi\"><font color=\"blue\"> 公開中</font></a></body>\n";
print "</html>\n";
exit;
}
sub unconnection
{
print "content-type: text/html\n\n";
print "<html><head><title>閉鎖中</title></head>\n";
print "<body><font size=\"2\" color=\"red\"> 閉鎖中</font></body>\n";
print "</html>\n";
exit;
}
これは理解できるんですけどねぇ。
はじめに教えてくれた方がwhileを使ってたのが気になりまして。。。
そう、前者はシンボリックリファレンス、後者はハードリファレンスと呼ばれているね。
前者はstrictプラグマで禁止することができる(というか、通常はstrictにしているべき)
0549nobodyさん
03/04/03 17:20ID:???こんな感じで作ってみたんですがもっと効率いい方法あったら教えてくれませんか?
なにぶん素人なんで、どういったコードが効率いいのかわからんのです。。
$copy = $message;
while($copy =~ m{(http://[\w\.\*\+\!\?\\\|\$\@\%\&\#:;/~=-]+)}gi){
my $url = $1;
# 同一ドメイン内へのリンク
if($url =~ /^http:\/\/$ENV{HTTP_HOST}\//i){
$message =~ s/\Q$url\E/<a href="$url" target="_blank">$url<\/a>/gi;
}
# その他外部リンク
else{
my $imenu = $url;
$imenu =~ s/^http:\/\///;
$message =~ s/\Q$url\E/<a href="imenu.cgi\/$imenu" target="_blank">$url<\/a>/gi;
}
}
0551nobodyさん
03/04/03 17:24ID:???仕様があやふやだから回答するほうも迷うんだよ。
whileを使ったのはファイルを最後まで読み込むためだろう。
ファイル中のどこにIPアドレスが入ってるかわからない質問だったから。
>なんとなく理解できるんですが、whileの中にifを入れないとできないのがよくわかりません。
whileのループ内でIPアドレスがあるかどうかの判定しないでどうするっての?
>if(<FILE> =/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)
ファイルハンドルについて勉強しなさい。
0553nobodyさん
03/04/03 17:35ID:os6gOz9a@f=<FILE>;
$_="@f";
chomp($_);
$text="\"$_\"";
print 'i=';
print "$text;\n";
test.datのなかみは
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
です。
このスクリプトを実行すると
";"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
document.form.text.value=i;
となります。
i="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
document.form.text.value=i;
と言う風にしたいのですが上のようになるのはなんでですか?
0554nobodyさん
03/04/03 17:38ID:???foreach (sort {$POINT{$b} <=> $POINT{$a}} keys %POINT)
でポイントの大きい順にソートできるのはわかるのですが
$name順にソートするにはどうしたらいいでしょうか?
05554
03/04/03 17:43ID:addlh6ntuse Benchmark;として得られたベンチマーク結果、
no1: 5 wallclock secs ( 4.40 usr + 0.01 sys = 4.41 CPU) @ 22727.27/s (n=100000)
このときの、usr と sysってなんすか?
0556457
03/04/03 17:49ID:???open(FILE,"ip.txt");
@data = <FILE>;
close(FILE);
if(@data = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/"){
&connection;
}else{
&unconnection;
}
こうですね。でも、なぜif(@data = "/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/")が代入演算子でするのでしょうか。
テキストのデータが*.*.*.*だった場合の処理だから比較演算子ではないんでしょうか?
0557nobodyさん
03/04/03 17:51ID:???#!/usr/bin/perl
open(FILE, "ip.txt");
$data = <FILE>;
close FILE;
if($data =~ /close/){
$dotti='非公開';
}else{
$dotti='公開';
}
print "content-type: text/html\n\n";
print "<html><head><title>$dotti</title></head>\n";
print "<body><h1>$dotti</h1></body>\n";
print "</html>\n";
exit;
05584
03/04/03 17:52ID:addlh6ntopen(FILE,"test.dat");
chomp($text =<FILE>);
close(FILE);
print qq/i="$text"\ndocument.form.txt.value=i/;
こんな感じにしたらどうだろうか?
0560457
03/04/03 17:56ID:???http://www.kent-web.com/perl/chap6.html
ここに@*という配列変数にセットするって書いていたので。。。
0561bloom
03/04/03 18:00ID:iUh0kMHD0562531 CGIでwww上のhtmlソースを取得
03/04/03 18:01ID:507cBmxsまた自力で頑張ろうと思います。m(__)m
0563nobodyさん
03/04/03 18:02ID:???配列ってのは複数のデータを格納するもの。
IPアドレスかcloseという語のどっちかなんでしょ?
それならスカラ変数でいいの。
0564457
03/04/03 18:03ID:???すいません。あと2つだけお願いします。
$data =~ /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/
これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
それと、なんで「==」ではだめなんでしょうか?
0570553
03/04/03 18:08ID:os6gOz9aすいません。それで試しても結果は変わりません。
ファイルから読み込まずにやるとうまくいくのですが・・・
0572531 CGIでwww上のhtmlソースを取得
03/04/03 18:10ID:507cBmxsおっしゃる通り説明不足でした、申し訳無い..
勉強して出直してきます。m(__;)m
0573nobodyさん
03/04/03 18:12ID:addlh6ntttp://hex51.darktech.org/cgi-bin/ubbs/bbs.pl?frame=2&base=44&no=44
0574nobodyさん
03/04/03 18:23ID:???めちゃくちゃにも程がある
配列も知らん香具師に何ができるんだ?
それにパターンマッチ云々知らなかったとしても
>これですが、「~ 」はどういった意味なんでしょうか?これがないとできなかったんですが、重要なものですか?
↑この発言はないだろ。
それぞれ一文字一文字にちゃんと意味があるに決まってるだろ?
聞く前にネットなり本なりで少しは調べろ
特に配列なんてのは大概一番最初の方ででてくることだ
0575その認識は改めたほうがいいよ。
03/04/03 18:44ID:???0576馬糞はんばーぐJr.
03/04/03 18:52ID:???誰に言ってるんだおみゃーは
0577531 CGIでwww上のhtmlソースを取得
03/04/03 18:58ID:507cBmxsわ.. そのCGIをローカルサーバと無料レンタルサーバで
試してみたところどちらでもちゃんと動きました。(汗
ソースもシンプルなのでとても参考になります。
このCGIを参考に自分のプログラムが動かなかった原因も
調べてみます、感謝っす!m(_ _;)m
0578nobodyさん
03/04/03 19:04ID:???553のスクリプトをWinXP+ActivePerlの環境で実行したら
i="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
となったので、そのスクリプトで問題ないのでは?
0579nobodyさん
03/04/03 19:06ID:???何だろ、俺も知りたい
UN*X の time(1) なら
user ... 実行に要した時間
sys ... システムのオーバーヘッドに要した時間
だけども。同じかな?
0581nobodyさん
03/04/03 22:00ID:???おたくなぁ、同じこと何回もかいてるんじゃねぇよ
現在使える分は5.8
6は使うならば自分でperlをコンパイルせねばならんのだからおたくのレベルにはかんけーねーよ
0583nobodyさん
03/04/03 23:31ID:LZizHVyk全角カナに強制的に変換されたりします。どうやって表示させればよいのでしょうか?
0584nobodyさん
03/04/03 23:38ID:???0586nobodyさん
03/04/04 00:43ID:MGOn1k3AここのUP掲示板です。
http://www.big.or.jp/~talk/t-club/soft/index.html
0587nobodyさん
03/04/04 00:48ID:???【 スクリプト改造工房 PART 6 】
http://pc2.2ch.net/test/read.cgi/php/1047806915/
0589nobodyさん
03/04/04 01:21ID:???0592nobodyさん
03/04/04 01:52ID:CT5BhxQdできればGETにしたくないのですが。
0593nobodyさん
03/04/04 01:59ID:???完全な方法はない。
保存データとの比較が最も安全ではあるが、間に別のデータが挟まれば結局無意味。
無難な方法はLocation。
0594nobodyさん
03/04/04 01:59ID:???0598nobodyさん
03/04/04 02:01ID:CT5BhxQdありがとう。locationで飛ばしてみます。
0599nobodyさん
03/04/04 02:04ID:CT5BhxQd0600brain
03/04/04 02:28ID:???掲載するにあたって必要なサーバースペースを有料レンタルしています。
お客様に快適なサーバーを提供するためにさまざまなホームページの目的に応じて、
単なるホームページスペースだけではなく、動画やゲームまたは個人放送はもちろん、
そのツールとしてCGI、PHP、SSI、SQLデータベースなどあらゆるサーバースペースを提供しております。
http://www.ebrain21.com/
[email protected]
0601nobodyさん
03/04/04 04:54ID:i3RHe7j/アパッチの1.3.27でActivePerlを使っていて、OSはXPです。
自宅サーバを使って、HPを作っているのですがカウンタが動かないんです。
掲示板は動いているので、CGIはちゃんと使えていると思ったのですが
なぜかカウンタだけ「×」がでたまま動いてないんです。
KENT WEBさんの夢カウンタを使用していて、設定や記述は何度も見直した
のですが、チェックモードでCGIまでのURLを打ち込んでみてもCGIファイルがその
まま開いてしまうのです。
すみませんが、何か心あたりがあえば教えてください。
ちなみに、前もHPを作ったことがあるのですが(同じパソコンで)その時
はちゃんと動きました。そのときは、知り合いに同じ質問をしてフォルダ
オプションから関連付けをしたら動いたような記憶があるのですが、OSを
再セットアップしたのでまた同じ症状になってしまっています。前聞いた
人間は「忘れた」とだけ言って相手にしてくれません(涙
検索しているのですが、なかなか見つかりません。すみませんが、
よろしくお願いしますです。
0603601
03/04/04 07:20ID:i3RHe7j/0605601
03/04/04 07:36ID:i3RHe7j/初心者なので、perlと関係があると思ってました。
別板行きます。
0606nobodyさん
03/04/04 08:12ID:jZjztjzXuse Win32::API;
と、書かれているのですが、これを読み込んだ瞬間にperl.exeのウインドウが閉じてしまいます
どう対処したらよいでしょうか?
0609nobodyさん
03/04/04 09:12ID:fwRQKvSx0610bloom
03/04/04 09:46ID:ZGDQypNs■ このスレッドは過去ログ倉庫に格納されています