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

【Perl】初心者コーナー Part12

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん02/04/27 23:17ID:1NNXdNsp
 
いらっしゃーい、Perlの「コーディング」で困ってる人のスレです。

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

1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。

CGIの質問は【CGIだけどなんか質問ある Pert 6 】
http://pc.2ch.net/test/read.cgi/php/1019561283/
参考書籍の話題は【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
スクリプトの改造依頼は 【スクリプト改造工房 Part4 】
http://pc.2ch.net/test/read.cgi/php/1012839651/

過去ログ、その他の役立ち情報は>>2-10を見よう。
 
0065nobodyさん02/04/29 11:30ID:???
>>35
dat落ちを防ぐには850で次スレに移行とかしたほうがいいのかねー
0066nobodyさん02/04/29 11:32ID:???
>>65
そんな気がする。
0067nobodyさん02/04/29 12:23ID:???
>>65
だろうね。トレンド語るようなスレなら1000ゲトーしても
良いかも知んないけど、質問系スレは900逝く前に移行して
新しくスレ立つごとにうまくageてれば良いと思う。
0068nobodyさん02/04/29 12:32ID:???
あまり無いような状況だけど例えば
A,B,C,D,E,Fって処理があってどれもお互いカブってないような状況なら
サブルーチン化して&A;・・・&F;ってやるのと
ただABCDEFって並べるのなら処理速度的に後者の方が良いんですかね?
0069nobodyさん02/04/29 12:45ID:???
>>68
うん。目に見える違いが出るかどうかはさておき。
0070nobodyさん02/04/29 12:57ID:???
>>68
ちなみに、本当にサブルーチンをばらして並べる人がいたら、
漏れはその人とは一緒に開発したくない。
0071nobodyさん02/04/29 13:00ID:???
>>70
そなの? 漏れは長くなりすぎる場合は機能の区切りがいいところで分けちゃうけど……
00727002/04/29 13:06ID:???
>>71
言葉足らずだったかな?
「サブルーチンをばらしてABCDEFって並べる人がいたら、 」
0073nobodyさん02/04/29 13:27ID:???
ずーっとひととおりあちこちまわってみたけど、どこもかいてあることが
むずかしくてわっかりませーん。

ここ初心者のとこでもむずかしいのねぇ。 びっくりさぁね。
みなさんのレベルで初心者って、、、はぁ。 もう、わけがわかりません。
0074nobodyさん02/04/29 13:41ID:kMaPAu7S
>>20
()内が単純なものなら2、複雑で読みにくくなったら4です。
スペース打つのがめんどいのと、極力横幅を縮めたいので。
0075nobodyさん02/04/29 13:57ID:???
gifcat ってあるじゃん? gif画像くっつけるやつ。

標準モジュールの中にそれってあるのか? だれでもいいから早めに答えろよ、
こっちはいそがしいんだからな。

いっとくが、とほほが配布してるやつはよせよ。うまくくっつかんからな。

それ以外でくっつける方法とかしってるやつがいたらもったいぶらないで教えろや。

0076nobodyさん02/04/29 14:42ID:???
>>75
それが人に教えてもらう態度か氏ねや
0077nobodyさん02/04/29 14:47ID:???
┌──────────────────────―─┐
│                                    |
│                                    |
│                                    |
│                                    |
│                /■\                    |
│               (´∀`∩)                   |
│               (つ  丿                |
│                ( ヽノ                    |
│                し(_)                |
│                                    |
│             Now Onigiring. ...               |
│                                    |
│         大変見苦しい場面がありました。 .       |
│         そのままおにぎりでお待ちください。.        |
│                                    |
│                                    |
└───────────────────────―┘
0078nobodyさん02/04/29 15:31ID:s0WzG4fn
そのサブルーチン内しか使わないような変数も全部my宣言した方が
良いんですか?例えばクッキーの要素とか。
0079nobodyさん02/04/29 15:47ID:???
>>78
もちろん。(例えば、で"クッキーの要素"を出すのはよく判らないが)
なるべく変数の有効範囲を狭くしたほうがいいかなと思うけど。
00807802/04/29 15:54ID:???
>>79
ありがとう。疑問解決したよ。何か俺の説明が悪かったね。
クッキーの要素ってのは、よく配布CGIスクリプトとかでよく見る
($year,$month,$week,・・・)みたいな奴のスカラ変数部ってこと。
0081nobodyさん02/04/29 16:11ID:q+P1YCSQ
フォームメールCGIでメールアドレスを登録してもらうときに全角英数字で
入力する人がいるので、全角英数→半角英数に自動で変換させたいんですが
どんなふうにすれば良いでしょうか?
0082nobodyさん02/04/29 16:18ID:???
>>81
jcode.pl 使っての変換ならこれかと
http://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H
00838102/04/29 16:21ID:q+P1YCSQ
>>82
ありがとうございます!
0084nobodyさん02/04/29 18:37ID:???
ょぅι゛ょ
0085nobodyさん02/04/29 19:20ID:NmdFgil6
ba0ka
0086nobodyさん02/04/29 22:00ID:NmdFgil6
こてはんはおえ
0087nobodyさん02/04/29 22:19ID:5LS+M/ng
このスレッドにコテハンが書き込み次第、このスレを処刑します。
0088コテハン02/04/29 22:20ID:???
コテハンですが何か?
0089nobodyさん02/04/29 22:22ID:5LS+M/ng
今までに、コテハンが書き込んだログはすべて削除依頼を出してください。
これは命令です。
0090_gnuzip02/04/29 22:59ID:???
これあげるから、成仏してね。

@in1 = (0,1,2,4,5);
@in2 = (6,7,8);

@c = &sum(\@in1,\@in2);

print join(',',@c),"\n";

sub sum {
 my($a,$b,$i,@ret,$n) = @_;
 $n = $#{$a} > $#{$b} ? $#{$a} : $#{$b};
 for($i=0;$i<=$n;$i++) {
push(@ret,${$a}[$i] + ${$b}[$i]);
 }
 return @ret;
}
0091nobodyさん02/04/29 23:35ID:???
汚いコードだな。いかにも厨房らしい。
0092_gnuzip02/04/29 23:46ID:???
>>91
リアル厨房ですが、何か?
0093nobodyさん02/04/29 23:49ID:???
いや、分かってるって。
知恵遅れは消えたら?
0094nobodyさん02/04/29 23:53ID:???
騙っても、書くコードのレベルでばれる、とか書いたら本人認定ですか?
0095_gnuzip02/04/29 23:57ID:???
>>94
騙ってませんが。
0096_gnuzip02/04/29 23:59ID:???
>>94
認定(w
つーか、本人は前スレ475でちゃんと書いてるしね。
0097_gnuzip02/04/29 23:59ID:???
>>95
騙ってるじゃん・・・
0098_gnuzip02/04/30 00:01ID:???
>>97
私がホンモノですが。
0099_gnuzip02/04/30 00:03ID:???
このスレッド専用の名無しさんです。
0100_gnuzip02/04/30 00:04ID:???
くそー、オレのコテハンがぁ(泣
0101_gnuzip02/04/30 00:07ID:???
>>100
なにか一席どうぞ。
010210002/04/30 00:16ID:???
>>101
朝練あるんで、もう寝ます。
0103nobodyさん02/04/30 00:17ID:???
75の質問にだれも答えてないじゃないか! なにやってんだよ、役立たずが
多いスレなのか?

90のような低レベルなこと書いてる場合じゃねーだろ!

こっちはいそがしいんだよ。 もうすこしだけまってやるからはやくしろよ。
役立たずどもはどっかいっちまえ。
0104nobodyさん02/04/30 00:38ID:???
(´-`).。oO(>>103 はカルシウム不足かな?…)
0105nobodyさん02/04/30 01:04ID:???
(´-`).。oO(カルシウム不足には牛乳だよな。_gyunyuなんちって…)
0106nobodyさん02/04/30 01:08ID:???
"_"には何の意味が。
0107_nobodyさん02/04/30 01:10ID:???
>>106
最新流行の予感。
0108_nobody02/04/30 01:11ID:???
くそっ
先を越された
0109nobodyさん02/04/30 02:16ID:???
>103
引きこもりに忙しいとかあるの?
0110nobodyさん02/04/30 11:36ID:???
なんか妙に荒れてんなぁ。
煽ってるのはいつものように一人だとは思うが…。
0111nobodyさん02/04/30 17:52ID:???
強制IDにならないかな。
0112nobodyさん02/04/30 19:15ID:vVTDvLw/
perlを勉強しはじめて2日目のタコですが、
よろしくお願いします。

REMOTE_HOSTと、HTTP_USER_AGENTと、HTTP_REFERERを
取得して、それを同じディレクトリのdata_log.txt に
書き込んでいく、というCGIを作りたいのですが、
いろんなサンプルを見ながらツギハギで書いてみたのですが、
どうしてもここから先がわかりません。
CGIで外部ファイルに書き込みを行うにはどのような処理を
行えばいいのでしょうか?
ご教授いただければ幸いです。
011311202/04/30 19:16ID:vVTDvLw/
ソースです。

#!/usr/local/bin/perl

print "Content-type: text/html\n\n";

#情報取得部

$host = $ENV{'REMOTE_HOST'};#クライアントのIPを取得
$user_agent = $ENV{'HTTP_USER_AGENT'};#クライアントのブラウザ
$referer = $ENV{'HTTP_REFERER'};#飛んできたサイト

#情報表示部

print "<b>REMOTE_HOST</b>: $host";
print "<BR>";
print "<b>HTTP_USER_AGENT</b>: $user_agent";
print "<BR>";
print "<b>HTTP_REFERER</b>: $referer";
print "<BR>";
print "<BR>";
print "<a href=\"http://localhost/~aya/cgi/data_log.txt\" target=\"_blank\">ログを表\示</a>";

#情報記録部(? data_log.txt)
sub write {
open(LOG,"+<$data_log.txt");
@logs=<LOG>;
unshift(@logs,"$host,$user_agent,$referer\n");
seek(LOG,0,0);
truncate(LOG,0);
print LOG @logs;
close(LOG);
}
0114nobodyさん02/04/30 19:22ID:???
>113
>open(LOG,"+<$data_log.txt");
この$が邪魔なんじゃない?
011511202/04/30 19:23ID:vVTDvLw/
>>114
うっス!取ってみますッス!
011611202/04/30 19:25ID:vVTDvLw/
うっス!

open(LOG,"+<$data_log.txt");
$取って見ました!

ログを表示してみたところ、
何も書き込まれていませでした!(T-T)
0117nobodyさん02/04/30 19:29ID:???
&wirte;呼んでないじゃないか。
0118nobodyさん02/04/30 19:29ID:???
>117
タイプミス。
&write;
0119nobodyさん02/04/30 19:33ID:???
>>116
当たり前だろ.どこかでwrite()すれ.
012011202/04/30 19:33ID:vVTDvLw/
>>117
なるほど!subっていうのをどこかで呼ばないとダメなんですね!

…どうやって呼ぶのでしょうかm(_ _; m?
0121nobodyさん02/04/30 19:34ID:???
カブターヽ( ´ー`)ノ
0122pear ◆FRUIT8pk 02/04/30 19:38ID:???
>>120
&write;
と、書くだけですね
それにしても2日でこれだけのソースを書くなんてすごいですね
012311202/04/30 19:39ID:vVTDvLw/
こうしてみました!
失敗しました!(T-T

print "<BR>";
print "<BR>";
print "<a href=\"http://localhost/~aya/cgi/data_log.txt\" target=\"_blank\">ログを表\示</a>";
write();

#情報記録部(? data_log.txt)
sub write {
open(LOG,"+<data_log.txt");
012411202/04/30 19:40ID:vVTDvLw/
わあああああああああああ!!!!!
できました!!!!!!
みなさん、ありがとうございます!!
012511202/04/30 19:41ID:vVTDvLw/
解決したソースです。

#!/usr/local/bin/perl

print "Content-type: text/html\n\n";

#情報取得部

$host = $ENV{'REMOTE_HOST'};#クライアントのIPを取得
$user_agent = $ENV{'HTTP_USER_AGENT'};#クライアントのブラウザ
$referer = $ENV{'HTTP_REFERER'};#飛んできたサイト

#情報表示部

print "<b>REMOTE_HOST</b>: $host";
print "<BR>";
print "<b>HTTP_USER_AGENT</b>: $user_agent";
print "<BR>";
print "<b>HTTP_REFERER</b>: $referer";
print "<BR>";
print "<BR>";
print "<a href=\"http://localhost/~aya/cgi/data_log.txt\" target=\"_blank\">ログを表\示</a>";
&write;

#情報記録部(? data_log.txt)
sub write {
open(LOG,"+<data_log.txt");
@logs=<LOG>;
unshift(@logs,"$host,$user_agent,$referer\n");
seek(LOG,0,0);
truncate(LOG,0);
print LOG @logs;
close(LOG);
}
012611202/04/30 19:45ID:vVTDvLw/
みなさん、わかりやすいアドバイスを有難うございます。
ここから、いろいろ応用できそうで、わくわくしてます♪

>>122
いえ、自力ではないです(^-^;
いろんなCGI配布サイトさまの、サンプルをかき集めて、
切り貼りしましたです。
アドバイス…というか、ズバリ回答を、ありがとうございました。

0127pear ◆FRUIT8pk 02/04/30 19:47ID:???
>>126
それでも自分でやった実力はつくと思いますよ
俺もまだ初心者ですがお互い頑張りましょう。
012811202/04/30 19:49ID:vVTDvLw/
>>127
ありがとうございます。
私も早く回答者さんに回れるように、がんばります。
0129nobodyさん02/04/30 19:53ID:???
>>123
あ,write()だと組み込み関数のwriteになっちゃうのか.
&表記をしないのであれば ::write() だったね.スマンカッタ.
013011202/04/30 20:01ID:vVTDvLw/
>>129
いえ、とんでもないです。
そういう場合もあるんですね。
勉強になりました♪
0131nobodyさん02/04/30 20:20ID:???
(´-`).。oO(>>125 <HTML><HEAD> ぐらいは書こうよ…)
0132nobodyさん02/04/30 20:42ID:???
ショッピングカートの作り方教えろ
0133nobodyさん02/04/30 20:43ID:???
(´-`).。oO(>>131それを言うなら<title>でしょ…<html>も<head>も省略可能だよ…)
0134nobodyさん02/04/30 20:48ID:???
>>133
ダウト
0135nobodyさん02/04/30 21:25ID:???
>>134
(´-`).。oO(XHTMLじゃダメだけどね… http://www.w3.org/TR/html401/index/elements.html 板違いスマソ…)
0136nobodyさん02/04/30 21:52ID:???
>>135ハァ?
0137nobodyさん02/04/30 23:02ID:gJDRgS/S
JavaScriptをStringfromCharCodeに変換するツールって あるんですか?
0138nobodyさん02/04/30 23:08ID:???
>>137
どゆこと?
013913702/04/30 23:11ID:gJDRgS/S
>>138
JavaScriptの内容を 数字化して素人さんに解読されないよーにしたいんですけど
0140nobodyさん02/04/30 23:12ID:64l1RWQD
携帯からの訪問かどうかを調べるには、どのようにすればいいんでしょうか?
0141nobodyさん02/04/30 23:30ID:???
>>139
お馬鹿さん?
0142nobodyさん02/04/30 23:34ID:???
>>139
素人さんは解読しないから大丈夫だよ。
つーか、StringfromCharCodeって、JavaScriptの文自体を生成できるんかいな?
014311202/04/30 23:42ID:vVTDvLw/
>>140
携帯からのアクセスだと、i-modeなら必ずdocomoのサーバーを
介してくる要求が来る筈ですし、c-htmlなんかを要求された
場合などが、見分けるヒントになりませんでしょうか?
素人見解ですいません。
014413702/04/30 23:59ID:gJDRgS/S
>>141
そーかも…
>>142
出来ますよ 実際ソース見ると
eval(String.fromCharCode(数字))
て、具合でしたから
014514202/05/01 00:02ID:???
>>144
おー、なるへっそ。それは面白いねぇ。
そのソースがあるサイトのURLキボン。
0146nobody02/05/01 00:14ID:???
>>145
ソース隠しとか
http://hp.vector.co.jp/authors/VA013453/temp/junk_index.htm
↑のver2.11ってところ
0147nobodyさん02/05/01 00:19ID:???
>>137
スマートな隠蔽はスマートに解読されがち。
document.write("(゚Д゚)ゴルァ world!!"); するのに400行くらいのダミー行を用意すればいい。
詰まるところ木を隠すなら森。更に言うならば板違い。
014813702/05/01 00:29ID:JaMCiNKs
>>147
すいません板違いで
ありがとうございました
014914502/05/01 00:42ID:???
>>148
ありゃ、行っちゃったかな。まぁいいや。

#!/usr/bin/perl

undef $/;
$_ = <>;
s/^(.*?)=//o;
s/\+/ /og;
s/%([a-fA-F0-9][a-fA-F0-9])/pack("c",hex($1))/oge;
$mes = $_ ? $_ : "ここに入れる";
$_ = join(", ",unpack("C*",$_));

print <<"EOF";
Content-Type: text/html

<form action="stringToCharCode.cgi" method="POST">
<textarea name="in" cols="80" rows="30">$mes</textarea>
<input type="submit">
<input type="reset">
</form>
eval(String.fromCharCode($_));
EOF
0150nobodyさん02/05/01 01:16ID:???
(´-`).。oO(>>149価値のないソースを見せてもらってワラタ)
0151nobodyさん02/05/01 02:05ID:Q/hHiA0V
>>149
文字化けします
perlじゃ無理なんですね
0152nobodyさん02/05/01 02:27ID:???
>151
とりあえず、JavaScriptで書いてみた。JavaScriptは初めてなので適当ですが、
IE5で動作しました。得られたコードは、Netscape4では動かない可能性が高いです。
特に、日本語が含まれるとき。

<html>
<head>
<SCRIPT>
function toCharCode (str) {
   var i = 0;
   var ret = "eval(\n\tString.fromCharCode(\n\t\t";
   var tmp = "";
   
   if (str != "") {
      
      while (i < (str.length - 1)) {
         ret += str.charCodeAt(i) + ", ";
         ++i;
         if (i % 16 == 0) {
            ret += "\n\t\t";
         }
      }
      ret += str.charCodeAt(i);
   }
   
   ret += "\n\t)\n);";
   document.ret.text.value = ret;
}
</SCRIPT>
</head>
<body>
<form name="form" method="POST" action="">
<textarea rows="15" name="text" cols="82"></textarea><br>
<input type="button" value="変換" name="btn_tr" onClick="javascript:toCharCode(document.form.text.value)">
</form>
<form name="ret" method="POST" action="">
<textarea rows="15" name="text" cols="82"></textarea><br>
</form>
</body>
</html>
015315202/05/01 02:38ID:???
あれれ、
<SCRIPT> → <SCRIPT LANGUAGE="JavaScript">
var tmp = ""; ←ゴミ
0154nobodyさん02/05/01 03:33ID:???
厨房質問ですいません。
use strict;って何の為にするんですか?
やると処理が早くなるとか、サーバー負荷が減るとかそういう効果が
あるんですかね?
0155nobodyさん02/05/01 03:35ID:IJ/Gv/S8

www.eseven.jp

ウェッブに関するご相談はこちらまで
ホームページ作成からCGI構築まで
国内有数のデザイン・センスとトップクラスのコンピューター・スキルを
あわせもったスタッフが対応します

0156pear ◆FRUIT8pk 02/05/01 07:24ID:???
>>140
どこからか落としたものデス

$agent = $ENV{'HTTP_USER_AGENT'};

if($agent =~ /^DoCoMo\/\d+\.\d+\/([^\/]*)/i){$name = "i-mode";}
elsif($agent =~ /^J-PHONE\//){$name = "J-Skyweb";}
elsif($agent =~ /^UP\.Browser[^-]*-(\w*) /i){$name = "EZweb";}
else{$name = "PCその他";}
0157nobodyさん02/05/01 07:59ID:???
>>154
グローバル変数の使用に警告を出したり間違いの可能性を指摘してくれたりします。
貴方の言う効果はありません。
でも出来るだけ書くことをお勧めします。
貴方以外の人がそのスクリプトを読むときに色々と助かります。
0158nobodyさん02/05/01 08:23ID:???
>>157
なんでプラグマとモジュールが同列に扱われてるんですか?
すごく違和感があるのですが。
0159nobodyさん02/05/01 09:22ID:???
>>158
つーより、プラグマモジュールだろ。
perldoc perlmodlib
0160nobodyさん02/05/01 09:53ID:???
>>158
元来Perlはそういったあらゆる制約を嫌う言語だからです。
自由な記述が出来るよう配慮したのではないでしょうか。
0161perl歴3日02/05/01 11:33ID:???
文字列から任意の文字列を削除するにはどうしたらいいんでしょうか?
たとえば

あういうえあいうえいあいうえ

から 'いう' だけを削除したいときとか。

~tr/いう//d; ではすべての 「い」 と 「う」が削除されちゃいますよね。
0162nobodyさん02/05/01 11:43ID:???
>>161

文字列 =~ s/いう//g;
0163nobodyさん02/05/01 11:43ID:???
>>161
s/いう//g;

そもそもtr/いう//d; って動くの? JPerl?
0164nobodyさん02/05/01 11:44ID:???
ケコーンするか…
0165perl歴3日02/05/01 11:46ID:???
>>162
>>163
ありがとうございます。perl歴3日はだてじゃなかったです。

>>163
例えを日本語にて行ってみました。
■ このスレッドは過去ログ倉庫に格納されています