Perlコーディング初心者質問スレ Part 38
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0839nobodyさん
04/11/21 19:01:17ID:ubTrO76Hif ($user_agent[0] eq 'DoCoMo') { $URL=$iURL; }
elsif ($user_agent[0] eq 'J-PHONE') { $URL=$vURL; }
elsif($user_agent[0] eq 'UP.Browser' || $user_agent[0] =~ /^KDDI/) { $URL=$eURL; }
else { $URL=$pURL; }
print "Location:$URL\n\n";
print "Content-type: text/html\n\n";
print "<HTML><HEAD><META HTTP-EQUIV=\"REFRESH\" CONTENT=\"10;URL=$URL\"><TITLE>auto jump</TITLE></HEAD><BODY><A HREF=\"$URL\">自動でジャンプしない場合はこちらから</A></BODY></HTML>";
exit;
というのでHPを携帯なら携帯で察知して携帯用HPに
飛ばすようにしているのですが
話題の京ぽんを携帯用に飛ばしたいのですが出来ません。
ご教授ください。
0841nobodyさん
04/11/21 19:48:30ID:w/cY/u9z@hoge=$url=~m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
で
<a href="http://gaerge">fgagear</a>
とかを取得すると、
http://gaerge">fgagear</a>
となってしまいます。
どこをどう直せばいいんでしょうか。
0843nobodyさん
04/11/21 20:07:53ID:w/cY/u9z正規表現メモを参考にしたんですが。
0844nobodyさん
04/11/21 20:55:58ID:???AirWiki: AirH"PHONE/AH-K3001V/FAQ
http://d.memn0ck.com/index.cgi?AirH%22PHONE%2FAH-K3001V%2FFAQ#i15
>>841
my $url = qq{<a href="http://gaerge">fgagear</a>};
my @hoge = $url =~ m/http:\/\/[-_.!~*'\[\]\(\)a-zA-Z0-9;\/?:\@&=+\$,%#]+/gi;
print "@hoge";
問題なさそうだけど。
0845nobodyさん
04/11/21 20:57:55ID:???コピペして @hoge を print してみたけど
http://gaergeになったよ
0846841
04/11/21 21:33:14ID:???正規表現事態は間違ってないみたいですね。
しかしなんでだろう・・
0847nobodyさん
04/11/21 22:26:23ID:hibhMAEScgiサーバーからhtmlサーバー内のログファイルを読み込むには、別サーバなので、
ソケットを使わなければいけないということで、とりあえずトップページを表示させようと、
次のソケットスクリプトを実行してみました。
$host = "www.xxxxxxxxxxx.com";
$page = "/";
$line = "";
$addr = (gethostbyname($host))[4];
$name1 = pack("S n a4 x8", 2, 80, $addr);
socket(S, 2, 1, 0);
connect(S, $name1);
binmode(S);
select(S);
$| = 1;
select(stdout);
print S "GET $page HTTP/1.0\r\n\r\n";
while (<S>) { $line .= $_; }
close(S);
print $line;
ページの指定を$page = "/index.html";にするとNot Found
$page = "/";にするとForbiddenという反応が返ってきてうまくいきません。
これはただ、パスの指定が悪いだけなのか、やはりサーバーの設定で
ソケットが使えないようになっていて、cgiサーバーからhtmlサーバーの
ファイルを読み込むのはあきらめなければならないということでしょうか?
0849nobodyさん
04/11/21 22:50:12ID:???0851839
04/11/21 22:51:26ID:ubTrO76Hどれもだめです。
そもそもの書き方を間違えているのでしょうか?
0853nobodyさん
04/11/21 23:48:01ID:???京ぽんつーのが何なのか知らないが、elseの中でUA名を表示させてみれば
どういうUA名で分岐すればいいのか分かるのでは?
0854nobodyさん
04/11/22 00:59:03ID:???いちいち1ファイルごとに読み込んでマッチ処理の繰り返しでは負荷的にも問題あるので、
データディレクトリでgrepかけて、該当したファイルのみ読み込みたいのですが、
perlでやるにはどうすればよいでしょう?
0855nobodyさん
04/11/22 01:10:34ID:???最もシンプルな記述はどんな感じになりますか?
0857nobodyさん
04/11/22 01:18:25ID:???0858nobodyさん
04/11/22 01:22:50ID:???>>1
【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0859nobodyさん
04/11/22 01:25:58ID:???open(IN,"grep '$keyword' file|");#実際にgrepを実行する
って手があるが、鯖によってはgrepはダメかもしれない。
ファイル名の検索ならFile::findで一発なんだが・・・。
0860855
04/11/22 01:31:38ID:???ifで書くと長いので。
>857
多謝。
0863nobodyさん
04/11/22 02:20:18ID:???ファイルの数が多ければ grep の方が軽いが、
少ないなら perl の中でループ回す方が鯖にやさしい。
てのはコーディングというより負荷軽減スレにふさわしい話題だが。
0865nobodyさん
04/11/22 03:28:27ID:???0866nobodyさん
04/11/22 04:23:59ID:???0867nobodyさん
04/11/22 04:47:42ID:???0868nobodyさん
04/11/22 05:42:53ID:/gdSyseW>>852
>print S "GET $page HTTP/1.0\r\nHost: $host\r\n\r\n";
hostを入れたら違う反応が返ってきて次のメッセージが表示されました。
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
ただ、期待したトップページは相変わらず表示されませんでした。
このメッセージからソケットが使えるって判断できるでしょうか?
0869nobodyさん
04/11/22 06:30:29ID:/gdSyseWトップページにはフレームを使っているので、表示されないみたいです。
取得したいログファイルを指定したら、見事に表示されたので、ソケットは使えることは確認できました。
ただ、次の応答メッセージが頭にくっついてくるので、これを取得しないようにすることはできるでしょうか?
HTTP/1.1 200 OK Date: Sun, 21 Nov 2004 20:36:26 GMT Server: Apache/1.3.27 (Unix) Last-Modified: Thu, 11 Nov 2004 02:34:45 GMT ETag: "718102-ddd-4192cfc5" Accept-Ranges: bytes Content-Length: 3549 Connection: close Content-Type: text/html
0871nobodyさん
04/11/22 07:06:38ID:???ヘッダの最後は
CRLFCRLF(最低限LFLF)
になってるので、取得した後、そこまでカットすれば問題ないっしょ。
0872nobodyさん
04/11/22 07:20:47ID:/gdSyseW取得した後で加工してカットするということですか?できれば、取得時にカットしたいのですが、
不可能であれば、最終手段はそうするしかないですね。
0873nobodyさん
04/11/22 07:48:05ID:???<>で読むなら、空行が出るまで別の変数に入れておくとか、空読みするとか。
あと、socketとconnectのエラー処理をした方がいいよ。
0874nobodyさん
04/11/22 08:44:18ID:???0875nobodyさん
04/11/22 10:28:03ID:/gdSyseW素人考えで申し訳ないですが、GETのところでオプションなどをつけてその応答メッセージを
出さないようにすることってできないものですかね?
HTTP/1.1 200 OK 〜〜text/html 取得したログファイルの内容〜
取得した内容は↑のようになっていて、応答メッセージと取得したログの間は半角スペースと
なっています。
応答メッセージを取得時にカットできない場合、取得後にカットするわけですが、シンプルに
カットするには、どういう方法があるでしょうか?perl初心者なもので、たびたびすみません。
0876nobodyさん
04/11/22 11:44:54ID:???チミはx68userのページ見て勉強してから出直すといい。
http://x68000.q-e-d.net/~68user/
別の解法: 他の人も言っているがLWPというチミがやりたいことをそのまま提供している
モジュールがあるので、そっちを使うと簡単。
「原理を理解しなくても目的を達成できりゃいい」という事ならばこっちをすすめる。
0878806
04/11/22 11:50:53ID:dylfkRdnprint "Content-type: image/jpeg\n";
print "Content-length: $filesize\n\n";
と書いてみました。swf側でファイルサイズを取得できて大喜びだったんですが、
jpg画像が途中から壊れて表示されるようになってしまいました。
>(一旦テンポラリファイルを作らないとだめかも知れないけど)
すみません。調べてみたのですが、ちょっと意味が。。。
0879nobodyさん
04/11/22 12:00:44ID:???もしContent-lengthをつけただけでそうなったのなら、
$fileseizeの値がおかしい可能性が高いな。
0880806
04/11/22 13:03:45ID:dylfkRdnレス、ありがとうございます!
print "Content-type: image/jpeg\n";
print "Content-length: 100000\n\n";
とかやってみたのですが、やはり画像が壊れて表示されます。
(こんなことしてはいけないのかな。。。)
0881806
04/11/22 13:14:51ID:dylfkRdnできました!!
やはり値がうまく入っていないだけでした。
ただ
($width, $height, $filesize)= $i->Get('width', 'height', 'filesize');
と値をとっただけなのでリサイズ前のファイルサイズがとれているだけなのですが。
テンポラリファイルとは一度このファイルをtmp.jpgとかにしてそのファイルサイズを
を測らなくてはならないという意味だったのでしょうか?
0882nobodyさん
04/11/22 14:04:38ID:/gdSyseWhttp://x68000.q-e-d.net/~68user/
x68userのページで、「HTTP クライアントを作ってみよう」という記事を見ましたが、
どうもヘッダを除いてボディだけを出力するというのはできなさそうに感じました。
LWPについてはx68userのページで一通り見ましたが、掲載されていないように
見受けられるので、いろいろ検索してそれらしい解説ページを見ましたが、
使用方法について内容の濃いページを見つけられませんでした。
一般的にどのサーバーにもLWPのモジュールが入っているのか?、当方のレンタル
サーバーでLWPは使えるのか?といった辺りからよくわかりません。
(見当違いなことを言っていたらごめんなさい。)
結局、ソケットでヘッダー(応答メッセージ)も含めてファイルを取得し、文字列操作
して、わざわざいらない部分を取り除かなければならないことになりそうです。
同じサーバーならopenしてファイルを参照できるのに、他サーバーのファイルを
参照するだけで、えらく苦労しています。
0883nobodyさん
04/11/22 14:15:38ID:???ボディだけ欲しいならHTTP/0.9で取れるが、HTTP/0.9はHostを送れないのでチミのホストでは駄目。
でも、ヘッダー読み飛ばすのなんか楽勝でしょ。
http://x68000.q-e-d.net/~68user/net/http-2.htmlだと38-41行
0884nobodyさん
04/11/22 14:30:16ID:C0NQJmHQそこに添付されてきた画像ファイルをCGIで読み込み
メインアカウント(例:main)内にあるフォルダに保存させています。
読み込むCGIをgetmail.cgiとするとこれを手動で実行すると
問題なく動作するのですが
crontabを用いて自動実行させると添付ファイルの保存がされません。
crontabによりgetmail.cgiは動作しているものの
保存のみがされないようです。
0-59/2 * * * * cd /home/sites/www.xxx.jp/web && /home/sites/www.xxx.jp/web/mailget.cgi
で実行させています。
環境はRed Hat Linux 7.3
Apache 1.3.27
Sendmail 8.11.6
です。ちなみに、別のレンタルサーバー(FreeBSD)では動作していました。
原因がどこにあるのかご教授ください。
0885nobodyさん
04/11/22 14:31:03ID:???>参照するだけで、えらく苦労しています。
いやそれはそういうモノだ
Perlコーディング以前の「コンピュータが動くしくみ」とかいう次元の問題として
0886nobodyさん
04/11/22 14:54:17ID:/gdSyseWひとまず、ご指摘の箇所を適用してヘッダーを読み飛ばし、ボディだけ抽出できました。
ありがとうございました。
0888nobodyさん
04/11/22 15:58:18ID:???実行ユーザ名・使用するファイルのパミッション・使用する環境変数等々
チェックすることはいっぱいあるよ。
んでも、エラーを適切に処理してればどこでコケたか分かるでしょ?
>>887
初心者自体がセキュリティフォールです。はい。
0889nobodyさん
04/11/22 15:59:51ID:???0890nobodyさん
04/11/22 16:04:25ID:C0NQJmHQ>>888さん、ありがとうございます。
色々チェックしましたがイマイチ解りません。
ブラウザから実行した場合は正常なのですが
crontabで自動実行した場合のみ保存がなされません。
調べたところ、添付ファイルの取り込みも問題ないようで
問題なのはopenして書き込む部分が実行されていないと言うことです。
ファイルの所有者とグループが違うのかと思ったのですが
これらは変更したりできるのでしょうか?
0892nobodyさん
04/11/22 16:12:24ID:???「私は子供に生まれないで良かったと、胸をなでおろしています!」っての。
>>888は初心者に生まれないで良かった胸をなでおろしてるんだろうな。
0893nobodyさん
04/11/22 16:14:31ID:???【初心者は】Perlコーディング初心者質問スレ Part 39【セキュリティフォール】
0894nobodyさん
04/11/22 16:15:46ID:???print "Content-type: text/plain\n\n";
print "Hello Perl !";
今日からPerlをはじめまして、本どうりにこれを打ち込んで、表示さしてみると
ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
メモ張にHello Pealと表示されます、本ではブラウザ上に表示されると
なっているのですが、違うCGIをためしてみるとちゃんとブラウザに表示されます。
本の付属のサンプルでやってもこれだけは、安心できる発信もとからの・・・
ファイルを開く 保存・・がでてブラウザに表示されません。これだけ
なぜかこうなります。
無視して、これは飛ばして次のCGIからやったほうがいいのでしょうか?
原因がわかるかたぜひおしえてください。
0896nobodyさん
04/11/22 16:30:35ID:???$keywordが実行されないようにしないと。
バッククォートは確実に殺しとけ。
0897nobodyさん
04/11/22 16:36:59ID:???かわらないのでperlの中だけで完結した場合に比べて
劇的に処理が軽くなるとはとは思えないのだが。
0898888
04/11/22 16:58:04ID:???| | (っ))) ヒャッホー! オレ様がスレタイに!!
| | //
|∧_∧ // >>890
(´∀`*// cgiの実行ユーザ名でcrontab -eを実行してないのでは?
l / その場合ならパーミッション関係でエラーがでて
保存できないこともありうる。原因を探らないと。
0899nobodyさん
04/11/22 17:45:56ID:???0900nobodyさん
04/11/22 17:51:31ID:TZImgkmIsubjectはちゃんとmimeエンコードしてるのですがfromに日本語を埋め込む時にも
mimeエンコードする必要がありますか?
JISでそのまま書いても駄目ですよね?
from: "送り先の人間の名前" <hoge@test.com>
みたいになってますがどうすれば大方のメールソフトで問題なく動作するでしょうか?
0901nobodyさん
04/11/22 18:11:55ID:???クズのくせに威勢がいいな。
特別に教えてやろう安全なパイプの使い方だ。二度と初心者に穴コード教えるなよ。ヘッポコ。
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('grep', $keyword, 'file') || die 'grep';
}
>>900
MIMEエンコードすりゃいいだけだろ。何が聞きたいんだ?
0904nobodyさん
04/11/22 19:16:13ID:4/apYG7/そんなんで虚勢張られてもなぁ・・・
空しくならない?
0905nobodyさん
04/11/22 19:19:21ID:???0906nobodyさん
04/11/22 19:34:33ID:???0907nobodyさん
04/11/22 20:17:07ID:???0908nobodyさん
04/11/23 01:17:07ID:???()もマズイか?
いずれにせよ、パイプの使い方云々って話じゃなくて。
0909nobodyさん
04/11/23 01:23:12ID:nMfYIywnshが余計な解釈して、コマンド実行されると困るからでしょ。
>>901の方法でパイプ使えばshは経由しないから、安全なの。
0910nobodyさん
04/11/23 02:23:51ID:7PvclRNn0911nobodyさん
04/11/23 02:54:05ID:???マーライオン , ―‐ 、
/r‐' ,ェェr‐..、
| l | ____Y)........
| l ヽ ┴‐┬'''''''''' ::::.........
| l l `ー‐1 ::::::::.......
7レヘ! / ::::::::::::.....
l |. | / :.:.:.:::::...
/7ーー7777! :.:.:.:::::....
T--l⌒ヽ{ l :.:.:.:.::::::...
|vv'レ⌒!'ー! :.:.:.:.::::::...
|vv'ヽソー1 :.:.:.:.::::::.
_ヽVVVー7__ :.:.:.:.:::::..
,〜〜〜〜〜〜〜ヽ ヽ、 :.:.:.:.:.:..::..
∠二二二二⌒二二二二二二ユ :.:.:.:.:.::::::...
0912nobodyさん
04/11/23 07:24:42ID:???出力するデータのサイズを出力しないとだめだよー。
>>894
・IEを投げ捨てて他のブラウザを使う。
・おまじないとして最後に"/"を付ける。
・Windows XP SP2にして、IEをレスポンスヘッダに従うように設定する(できるらしい)。
・HTMLで出力する。
原因はIEの仕様。
0913nobodyさん
04/11/23 08:01:40ID:???0914nobodyさん
04/11/23 09:12:03ID:???> ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
> メモ張にHello Pealと表示されます、
これから察するに、CGIとして動作していると思うが。
0915nobodyさん
04/11/23 09:31:30ID:???CGIとして動作しているのはたしかだが
ダイアログを出したくないんだったらこうしなされ。
x print "Content-type: text/plain\n\n";
o print "Content-type: text/html\n\n";
0917nobodyさん
04/11/23 10:25:43ID:???print "Hello Perl !";
なのに「Hello Peal」って表示されるんだぞ。
Perl自体のバグでは?
0918nobodyさん
04/11/23 11:00:08ID:???>>909ではないですが、それが実行されるOSを教えてくれませんか。
FreeBSDで確認できなかったので。
それから、一応貼っておきますね。
CGIプログラミングとセキュリティ
http://www.ansi.co.jp/tech/cgi/security/programming.html
> また、以下のように引数が2個以上の exec と組み合わせるとメタキャラクタの解釈が行われない。
> open GREP, "-|" or exec "/usr/bin/grep", "-e", $CGI{str}, "/path/to/data/file" or die;
perlsec - Perl security
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlsec.html
> open(FOO,"echo $arg|"); # Not OK, but...
> open(FOO,"-|")
> or exec 'echo', $arg; # OK
# 今のperlsecでは、この方法もAlso not OKにされています。
0919nobodyさん
04/11/23 11:08:09ID:nMfYIywn顔真っ赤にして、嘘付くなよ。ヘッポコ
実験すれば実行されないことは簡単にばれちゃうのに、事実を捻じ曲げてまで絡んでくるとは
そんなに馬鹿にされたのが悔しいのかな?
でも、実際馬鹿なんだからしょうがない。親を恨んであきらめることだ。
$keyword=';rm -f *';
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('/bin/echo', $keyword, 'file') || die 'grep';
}
while(<IN>) {
print $_;
}
0921nobodyさん
04/11/23 11:13:10ID:???だ。;が抜けてる。*fileだったらそんなファイルなけりゃ何も削除されん罠
0922nobodyさん
04/11/23 11:27:41ID:nMfYIywnやってから言えよ。ヘッポコ。行末の;を入れたって実行されねーよ。
破壊的な馬鹿だな。
0923nobodyさん
04/11/23 12:00:00ID:???"test.pl" [New File] 12 lines, 213 characters [E]
[***@***** test]$ chmod +x test.pl
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
[***@***** test]$ ./test.pl
;rm -f *; file
[***@***** test]$ ls
aaaa ahie aisjrioe iruiet test.pl*
コードは>>919に;いれた奴
0924nobodyさん
04/11/23 12:24:02ID:???perlは奴のようなヘッポコでもそれなりのコードをでっち上げる事が出来てしまうので、
「俺ってできるじゃん」と勘違いしてしまったのだろう。
勘違いして玉砕してしまった>>916に「伝説のヘッポコ」のコテを贈ろう。次からはこのコテで出て来い。ゲラゲラ
0925伝説のヘッポコ
04/11/23 12:38:20ID:???ヾヽ!lV/ / ,/ / ,' ハ、: .
,ィニ≧ゝレ' / / ,./ / , ハ : : .
く<-‐7´ _」] l l/_,∠/ / / / い : : .
 ̄ノ/: :f r'l l /レ'/、_/‐ト'、/l| li l : : : : .
. : {ハ : :|{(l|y==ミ _ノ、/ソリ ll | : : : : :
: : : :ヽヽ: :|、lハl、゙ ⌒ヾlノリ ll l : : : : : :
: : : : : : : : V\ヽ、 `ー ゛ノルんイリノ : : : : : :
: : : : : : : : : ,.--、_ハ`−r=ニ--、′ノ. : : : : : : :
: : : : : : : : / /-ョロ'ヲ´ i l : : : : : : : : : :
: : : : : : : 〈 ,ハフ'兀「 ! } : : : : : : : : :
: : : : : : : : ヽ, ト{‐lハ. ヽ ' ノ : : : : : : : :
0926nobodyさん
04/11/23 13:14:57ID:7PvclRNn黙って頭下げて俺の靴でもなめてりゃいいんだよカスどもが(pgr
0927nobodyさん
04/11/23 14:23:34ID:???0928nobodyさん
04/11/23 14:24:02ID:nMfYIywn0929nobodyさん
04/11/23 15:22:41ID:???そろそろ次スレの頃合かの。
0930nobodyさん
04/11/23 16:09:24ID:???gzipの利点は「負荷を削減する」「転送量を減らす」というのは分かりましたが、早さの面ではどうなりますか?
私としては、転送量を減らすので早くなりそうな気もしますが、ブラウザに解凍する処理をさせるので遅くなりそうな気もします。
ご回答を宜しくお願いします。
0931nobodyさん
04/11/23 16:30:41ID:???返すことを一度にやりたいんですけどできません。
どうやればいいのでしょうか?
0932nobodyさん
04/11/23 16:40:17ID:???0933nobodyさん
04/11/23 16:48:03ID:???自分のサイトで他ページの情報を一部使いたいのです。
0934nobodyさん
04/11/23 16:48:35ID:???自鯖でやらせるんならええけど、レンタルでやったら怒られること間違い無しであろう。
2ch閉鎖みたいに転送量でゴルァされて初めて意味がある処理ではある。
0936nobodyさん
04/11/23 17:36:00ID:???無名ハッシュのリファレンスを得るなら、先に得ないと無理だと思う。
で、無名のハッシュのリファレンスを得て、ハッシュスライスに値を代入にしてみたけど。
use strict;
use Data::Dumper;
my @pos = qw(msn yahoo google);
my $value = 'search engine.';
my $hash_ref;
@{($hash_ref = {})}{@pos} = ($value) x @pos;
print Dumper($hash_ref);
レス数が900を超えています。1000を超えると表示できなくなるよ。