Perlコーディング初心者質問スレ Part 38
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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);
0939nobodyさん
04/11/23 20:55:05ID:???http://tmp4.2ch.net/test/read.cgi/kitchen/1100420247/
0940nobodyさん
04/11/23 22:21:01ID:???ブラウザの負荷はあまり気にしなくても良いよ。
低スペックのPCでISDNでも体感速度は速くなった。
もし、テーブルを使ったレイアウトをしているなら、
gzipよりもHTMLを変更した方が体感速度は速くなることが多い。
サーバー負荷が心配なら予め圧縮しておくと良いよ。
0941nobodyさん
04/11/24 04:36:06ID:???でもこれじゃ>>854の言う「データディレクトリでgrepかけて、該当したファイルのみ読み込みたい」
ってのは無理だね。
0942nobodyさん
04/11/24 10:14:07ID:???スクリプト内で一つ一つ開いてやれ。たいして負荷かわらんってオチか。
0943nobodyさん
04/11/24 14:24:18ID:???0944nobodyさん
04/11/24 14:55:14ID:???LWPモジュールだと、テキストデータしか取得できないと思うのですが、
指定したURL自体のスクリーンショットみたいに画像データとして取得を行う様なPerlのモジュールとかってありませんか?
もし存在すればモジュールの名前を教えてください。
こんな感じで指定したURLの画面を表示したいのです。
ttp://sea.search.msn.co.jp/preview.aspx?&q=%e5%85%89%e3%83%95%e3%82%a1%e3%82%a4%e3%83%90%e3%83%bc%e3%80%80%e3%83%97%e3%83%ad%e3%83%90%e3%82%a4%e3%83%80%e3%83%bc
よろしくお願いします。
0945nobodyさん
04/11/24 15:56:51ID:???この['a','b','c']を@bbbに入れたいなんて場合はどうすればいいですか?
0947nobodyさん
04/11/24 16:26:31ID:???0949944
04/11/24 17:31:19ID:???画面のスクリーンショットを取得できるんですか?
もう少しマニュアル読んでみます。
0950nobodyさん
04/11/24 17:33:37ID:???HTMLレンダリングしたページイメージを取得したい、
という話らしい。
>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。
必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
0951nobodyさん
04/11/24 20:28:29ID:???http://www.babysimon.co.uk/khtml2png/
こういうのを利用するといいんでは。
モジュールではないし、XやQt、KDEに依存するけど…。
0952nobodyさん
04/11/24 22:05:26ID:???http://marginalhacks.com/Hacks/html2jpg/
こっちはPerlスクリプトだね。
X+Mozilla+ImageMagickかな。
0953nobodyさん
04/11/24 22:19:47ID:???大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。
他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで
使っているwebnailとか。
0954nobodyさん
04/11/25 00:19:16ID:???サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
0955nobodyさん
04/11/25 00:33:25ID:???opendir,readdirかFile::Findかどちらを使うべきだろう。
1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね?
(ファイルは階層的に掘り下げる必要は無いんですが)
0956nobodyさん
04/11/25 01:11:28ID:???$key = 'bbb';
このような変数があるとして、$keyが@arrayの要素に存在するかどうかを
一発で判定する書き方って無いでしょうか?
0957nobodyさん
04/11/25 01:12:46ID:???0959nobodyさん
04/11/25 01:24:36ID:???0960nobodyさん
04/11/25 01:27:59ID:???2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
0961nobodyさん
04/11/25 01:46:49ID:???0962nobodyさん
04/11/25 01:50:38ID:???0963nobodyさん
04/11/25 01:56:17ID:???単一階層なら readdir 。
>>956
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o
${{ map { $_, 1 } @array }}{$key} ? 'exists' : 'not found';
0966nobodyさん
04/11/25 08:26:21ID:???cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
0967nobodyさん
04/11/25 11:25:21ID:???0968nobodyさん
04/11/25 12:32:23ID:???import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。
俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
0969nobodyさん
04/11/26 02:05:36ID:???ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
0970nobodyさん
04/11/26 08:03:16ID:???my @data_list = qw/name date com/;
my %data = ();
〜〜
while (<FILE>) {
my @temp = split(/<>/);
$data{$data_list[$_]} = $temp[$_] for (0..$#data_list);
print '名前:', $data{'name'}, $data{'date'}, $data{'com'}, '<br />';
}
現在はこのように一旦別の配列に格納してからループしてます。
split(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
0971nobodyさん
04/11/26 08:28:36ID:hJWQX2yrActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。
my $Name_T = '';
$Name_T =~ s/([\x20(){},+^~%`])/{$1}/g;
いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース
+なまえ+ → {+}なまえ{+}
%^なまえ^% → {%}{^}なまえ{^}{%}
こんな感じです。始めは上手くいっていたのですが不具合をみつけました。
"タ"や"ミ"、全角の"+"などです。
"タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。
ご指摘、アドバイス等いただければ幸いです。
0976972
04/11/26 13:09:04ID:???そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。
まぁ、EUCにもしておいた方が無難。
0977nobodyさん
04/11/26 14:49:02ID:eKQW3m7fと言う事がしたくて教本を見ながらやっていたのですが
#!/usr2/bin/perl
BEGIN{ $| = 1; print "Content-type: text/html\n\n"; open(STDERR, ">&STDOUT"); }
#ライブラリ
require 'cgi-lib.pl';
#デコードするサブルーチン
&ReadParse(*form);
#ライブラリ
require 'jcode.pl';
#文字コード変換のサブルーチン
&jcode'convert(*form, 'sjis');
#連想配列から値だけを取り出し、区切りのハイフンを追加
$data="$form{'kansou'}\n\n-------\n\n";
#追加書き込みモード
open(ENQ, ">>enquete.dat") || die "File 'enquete.dat' Open Error."
flock(ENQ, 2);
print ENQ $data;
flock(ENQ, 8);
close(ENQ);
--以下HTML文--
これをサーバー上で実行すると
「syntax error at enquete.cgi line 21, near "flock" Execution of enquete.cgi aborted due to compilation errors.」
と言ったエラーが出ました。
教本についてたサンプルを使ってやっても同じエラーが出てしまうのですが…どこか間違っている部分がありますでしょうか?
ググってもどれが参考になってるのかもよく分からず…お手数ですがご教授お願いいたしますm(_ _)m
0978nobodyさん
04/11/26 14:49:58ID:???0979nobodyさん
04/11/26 14:56:31ID:???と出たときの8割は
20行目の行末のセミコロンを付け忘れている
0980nobodyさん
04/11/26 15:01:55ID:???21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。
おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
0981nobodyさん
04/11/26 15:04:08ID:???解決しました、ありがとうございましたorz
0983nobodyさん
04/11/26 18:13:14ID:???requireしていく方が速いでしょうか?
0984nobodyさん
04/11/26 18:17:30ID:???0985nobodyさん
04/11/26 18:46:45ID:???昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。
でも最近はベタ書きばかりだけど。
javaではしっかりモデリングするんだけど、言語によって人格変わる。
0986nobodyさん
04/11/26 19:09:23ID:???文字 x があり、x が'\x20(){},+^~%`'のいずれかであった場合、
xを'{}'で囲むということは、言い換えれば(\x7b x \x7d)という文字列を作るということです。
'+'は (\x81\x7b)で、\x7bは'{'なのでマッチし、
'{}'で囲って(\x81\x7b\x7b\x7d)になります。
(\x81\x7b)は'+'で、\x7bは'}'なので、'+{}'になります。
'タ'は(\x83\x5e)で\x5eは'^'なのでマッチし、
'{}'で囲って(\x83\x7b\x5e\x7d)になります。
'ミ'は(\x83\x7e)で\x7eは'~'なのでマッチし、
'{}'で囲って(\x83\x7b\x7e\x7d)になります。
(\x83\x7b)は'ボ'、\x5eは'^'、\x7eは'~'なので、
それぞれ'ボ^}'と'ボ~}'になります。
解決策は
use encoding "shiftjis";
です。
>>976
大丈夫ではありません。
0987nobodyさん
04/11/27 08:15:26ID:???0988nobodyさん
04/11/27 10:19:32ID:???タグを無効にしたり文字コード変換したりしますよね?
この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、
どんな風にデータを取り回してますか?
私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、
何だか領域が勿体無い気もします。
0989nobodyさん
04/11/27 11:30:32ID:???Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
0990nobodyさん
04/11/27 11:38:48ID:???Perlコーディング初心者質問スレ Part 39
http://pc5.2ch.net/test/read.cgi/php/1101522903/
レス数が950を超えています。1000を超えると書き込みができなくなります。