Perlコーディング初心者質問スレ Part 38
open() 関数の戻り値が false だったら $! を表示させてみる、とかな
900 :
nobodyさん:04/11/22 17:51:31 ID:TZImgkmI
sendmail時のことで質問です。
subjectはちゃんとmimeエンコードしてるのですがfromに日本語を埋め込む時にも
mimeエンコードする必要がありますか?
JISでそのまま書いても駄目ですよね?
from: "送り先の人間の名前" <
[email protected]>
みたいになってますがどうすれば大方のメールソフトで問題なく動作するでしょうか?
>>887 クズのくせに威勢がいいな。
特別に教えてやろう安全なパイプの使い方だ。二度と初心者に穴コード教えるなよ。ヘッポコ。
$pid = open(IN, "-|");
if (!defined($pid)) {
die "cannot fork";
} elsif ($pid == 0) {
exec('grep', $keyword, 'file') || die 'grep';
}
>>900 MIMEエンコードすりゃいいだけだろ。何が聞きたいんだ?
>>894 .cgiファイル?
まあどっちにしろ
__END__を忘れてないか
あとどんな本だ?
>>894 ここはコーディングの質問スレなので、それ以前の方はお引き取りください。
904 :
nobodyさん:04/11/22 19:16:13 ID:4/apYG7/
>>901 そんなんで虚勢張られてもなぁ・・・
空しくならない?
後出しじゃんけん キタ━━━━(゚∀゚)━━━━ッ!!
っていうか悪意のある入力値のサニタイズとは関係ない気が。
外野だけど$keyword = quotemeta($keyword)じゃだめ?
バッククォートとシングルクォートだけで良いと思うけど。
()もマズイか?
いずれにせよ、パイプの使い方云々って話じゃなくて。
909 :
nobodyさん:04/11/23 01:23:12 ID:nMfYIywn
あのね、僕ちゃん達、何のためにサニタイズするの?
shが余計な解釈して、コマンド実行されると困るからでしょ。
>>901の方法でパイプ使えばshは経由しないから、安全なの。
910 :
nobodyさん:04/11/23 02:23:51 ID:7PvclRNn
まぁまぁ、まぁまあ、
マーライオン , ―‐ 、
/r‐' ,ェェr‐..、
| l | ____Y)........
| l ヽ ┴‐┬'''''''''' ::::.........
| l l `ー‐1 ::::::::.......
7レヘ! / ::::::::::::.....
l |. | / :.:.:.:::::...
/7ーー7777! :.:.:.:::::....
T--l⌒ヽ{ l :.:.:.:.::::::...
|vv'レ⌒!'ー! :.:.:.:.::::::...
|vv'ヽソー1 :.:.:.:.::::::.
_ヽVVVー7__ :.:.:.:.:::::..
,〜〜〜〜〜〜〜ヽ ヽ、 :.:.:.:.:.:..::..
∠二二二二⌒二二二二二二ユ :.:.:.:.:.::::::...
>>881 出力するデータのサイズを出力しないとだめだよー。
>>894 ・IEを投げ捨てて他のブラウザを使う。
・おまじないとして最後に"/"を付ける。
・Windows XP SP2にして、IEをレスポンスヘッダに従うように設定する(できるらしい)。
・HTMLで出力する。
原因はIEの仕様。
894は拡張子がcglとかなんだってば
>>913 > ファイルを開く、保存のダイアログボックスが表示されます。開くを押すと
> メモ張にHello Pealと表示されます、
これから察するに、CGIとして動作していると思うが。
>>894 CGIとして動作しているのはたしかだが
ダイアログを出したくないんだったらこうしなされ。
x print "Content-type: text/plain\n\n";
o print "Content-type: text/html\n\n";
>>909 ポカーン。
$keyword に
; rm -rf *;
って入れると実行されちゃいますが?
死ねよキチガイ。
みんな冷静になって
>>894を読んでみろよ。
print "Hello Perl !";
なのに「Hello Peal」って表示されるんだぞ。
Perl自体のバグでは?
919 :
nobodyさん:04/11/23 11:08:09 ID:nMfYIywn
>>916 顔真っ赤にして、嘘付くなよ。ヘッポコ
実験すれば実行されないことは簡単にばれちゃうのに、事実を捻じ曲げてまで絡んでくるとは
そんなに馬鹿にされたのが悔しいのかな?
でも、実際馬鹿なんだからしょうがない。親を恨んであきらめることだ。
$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 $_;
}
>>919 grepに失敗するだけでrm -rf は実行されるぞ低能
あとrm -rf *;
だ。;が抜けてる。*fileだったらそんなファイルなけりゃ何も削除されん罠
922 :
nobodyさん:04/11/23 11:27:41 ID:nMfYIywn
>>920 やってから言えよ。ヘッポコ。行末の;を入れたって実行されねーよ。
破壊的な馬鹿だな。
気になったから試してみた
"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に;いれた奴
>>916は逃亡か?
perlは奴のようなヘッポコでもそれなりのコードをでっち上げる事が出来てしまうので、
「俺ってできるじゃん」と勘違いしてしまったのだろう。
勘違いして玉砕してしまった
>>916に「伝説のヘッポコ」のコテを贈ろう。次からはこのコテで出て来い。ゲラゲラ
│ト、l、 /´, '`⌒'´ `ヽ: : .
ヾヽ!lV/ / ,/ / ,' ハ、: .
,ィニ≧ゝレ' / / ,./ / , ハ : : .
く<-‐7´ _」] l l/_,∠/ / / / い : : .
 ̄ノ/: :f r'l l /レ'/、_/‐ト'、/l| li l : : : : .
. : {ハ : :|{(l|y==ミ _ノ、/ソリ ll | : : : : :
: : : :ヽヽ: :|、lハl、゙ ⌒ヾlノリ ll l : : : : : :
: : : : : : : : V\ヽ、 `ー ゛ノルんイリノ : : : : : :
: : : : : : : : : ,.--、_ハ`−r=ニ--、′ノ. : : : : : : :
: : : : : : : : / /-ョロ'ヲ´ i l : : : : : : : : : :
: : : : : : : 〈 ,ハフ'兀「 ! } : : : : : : : : :
: : : : : : : : ヽ, ト{‐lハ. ヽ ' ノ : : : : : : : :
926 :
nobodyさん:04/11/23 13:14:57 ID:7PvclRNn
どうせここにいる連中は俺より低脳なんだから、
黙って頭下げて俺の靴でもなめてりゃいいんだよカスどもが(pgr
↑ 締め付けチカンビーム発射!!
928 :
nobodyさん:04/11/23 14:24:02 ID:nMfYIywn
その中で最下層に位置してるのが
>>916である事は間違い無さそうだ。
おやおや、めずらしく荒れてますな。
そろそろ次スレの頃合かの。
初めまして。gzipに関する質問です。
gzipの利点は「負荷を削減する」「転送量を減らす」というのは分かりましたが、早さの面ではどうなりますか?
私としては、転送量を減らすので早くなりそうな気もしますが、ブラウザに解凍する処理をさせるので遅くなりそうな気もします。
ご回答を宜しくお願いします。
無名ハッシュに、ハッシュのスライスで値をセットしてそのリファレンスを
返すことを一度にやりたいんですけどできません。
どうやればいいのでしょうか?
PerlとPHPってどっちがいいですか?
ページ全体(例えばyahooのトップなど)を配列に取り込む方法はないでしょうか。
自分のサイトで他ページの情報を一部使いたいのです。
>>930 自鯖でやらせるんならええけど、レンタルでやったら怒られること間違い無しであろう。
2ch閉鎖みたいに転送量でゴルァされて初めて意味がある処理ではある。
935 :
930:04/11/23 16:51:27 ID:???
>>934 >レンタルでやったら怒られること間違い無しであろう。
それは何故ですか?
>>931 無名ハッシュのリファレンスを得るなら、先に得ないと無理だと思う。
で、無名のハッシュのリファレンスを得て、ハッシュスライスに値を代入にしてみたけど。
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);
>>935 回線の負荷は減らせるが、逆にサーバマシンの負荷は増大する。
938 :
930:04/11/23 17:54:03 ID:???
>>937 そういうことだったんですか。。負荷状況を見ながら導入を検討したいと思います。ありがとうございました。
>>930,938
ブラウザの負荷はあまり気にしなくても良いよ。
低スペックのPCでISDNでも体感速度は速くなった。
もし、テーブルを使ったレイアウトをしているなら、
gzipよりもHTMLを変更した方が体感速度は速くなることが多い。
サーバー負荷が心配なら予め圧縮しておくと良いよ。
execでメタキャラクタを解釈させないようにすると。
でもこれじゃ
>>854の言う「データディレクトリでgrepかけて、該当したファイルのみ読み込みたい」
ってのは無理だね。
結局、grepだって一つ一つファイル開くんだし
スクリプト内で一つ一つ開いてやれ。たいして負荷かわらんってオチか。
楽にやりたけりゃFile::Searcher使えって話。
@aaa = (['a','b','c'],['A','B','C']);
この['a','b','c']を@bbbに入れたいなんて場合はどうすればいいですか?
>>944 IEコンポーネントとか使わないと難しいんじゃない?
LWP云々の問題じゃないし
=@{$aaa[0]};
>>944 > LWPモジュールだと、テキストデータしか取得できないと思うのですが、
取れるだろ?
949 :
944:04/11/24 17:31:19 ID:???
>> 948
画面のスクリーンショットを取得できるんですか?
もう少しマニュアル読んでみます。
いや、
>>944 の言いたいことは、
HTMLレンダリングしたページイメージを取得したい、
という話らしい。
>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。
必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
html2[jpg,bmp,png,ps etc.] でググれば結構見つかるよね。
大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。
他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで
使っているwebnailとか。
デスクトップ環境構築してるなら、数行のShellスクリプトで済むけど。
サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
あるディレクトリ内のファイル名一覧を取得する時って、
opendir,readdirかFile::Findかどちらを使うべきだろう。
1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね?
(ファイルは階層的に掘り下げる必要は無いんですが)
@array = ('aaa','bbb','ccc');
$key = 'bbb';
このような変数があるとして、$keyが@arrayの要素に存在するかどうかを
一発で判定する書き方って無いでしょうか?
(;゚Д゚)
いえ、ループとか制御構文使わないで、1行ですっきり判定する方法ないかなーと・・・
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
map使えば簡潔に書ける。と思うが。
ていうか連想配列でif($array{$key}){処理;}とかでいいじゃない。
>>956 my $count = grep{ $_ eq $key } @array;
# 中身はループだけどね。
最近CGI.pm使い始めたんだけど、もしかして重いですか?
cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
さあ?ってか必要なのだけインポートしなよ。
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、
import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。
俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
Template Kit重いのかー。
ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
掲示板で、データを順番に、任意のハッシュに入れたいのですが、
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(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
971 :
nobodyさん:04/11/26 08:28:36 ID:hJWQX2yr
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。
my $Name_T = '';
$Name_T =~ s/([\x20(){},+^~%`])/{$1}/g;
いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース
+なまえ+ → {+}なまえ{+}
%^なまえ^% → {%}{^}なまえ{^}{%}
こんな感じです。始めは上手くいっていたのですが不具合をみつけました。
"タ"や"ミ"、全角の"+"などです。
"タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。
ご指摘、アドバイス等いただければ幸いです。
>>971 文字コードをEUCにして下さい。
SJISだと他にも同じような事がいっぱい起こります。
>>970 ハッシュのスライス使って
@data{@data_list} = split(/<>/);
あたりでどうすか?
974 :
970:04/11/26 10:48:29 ID:???
>>973 ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
975 :
971:04/11/26 11:00:48 ID:???
>>972 ありがとうございます。
文字コードEUCについて調べてみます。
976 :
972:04/11/26 13:09:04 ID:???
>>971 そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。
まぁ、EUCにもしておいた方が無難。
977 :
nobodyさん:04/11/26 14:49:02 ID: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
さげ忘れ…すいませんorz
syntax error at enquete.cgi line 21
と出たときの8割は
20行目の行末のセミコロンを付け忘れている
>>977 21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。
おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
なんと…三十分も見落とし続けてた…お恥ずかしい●| ̄|_
解決しました、ありがとうございましたorz
>>980 改行が多すぎると出たので改行も消してました。
重ね重ね申し訳ないorz
実行ステップ数は変わらない場合、1ソースよりも、ソース分割して必要に応じて
requireしていく方が速いでしょうか?
use Benchmark;
実行ステップ数が変わらないんじゃたいして意味無いと思うぞ。
昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。
でも最近はベタ書きばかりだけど。
javaではしっかりモデリングするんだけど、言語によって人格変わる。
>>971 文字 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 大丈夫ではありません。
次スレキボン
CGI.pmの場合、$query->param(hoge);とかでフォームからの入力データを参照できますが、
タグを無効にしたり文字コード変換したりしますよね?
この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、
どんな風にデータを取り回してますか?
私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、
何だか領域が勿体無い気もします。
>>988 Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
cgi-lib使ってた頃は%inを直接いじってたので、CGI.pmに乗り換えた時に
$queryから更に別領域にデータ確保するのは何となく抵抗あったな。
でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。
気にスンナ。
($hoge) = split(/<>/)
と
$hoge = substr($_, 0, index($_, '<>')
はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
>>992 100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
ぱっと見、substrの方が最初の'<>'が見つかった時点で文字列サーチ
終わるから速そう。てことでベンチ。
use Benchmark;
$s = 'foo<>baa';
timethese(undef, {
split => sub {
($hoge) = split(/<>/, $s);
},
substr => sub {
$hoge = substr($s, 0, index($s, '<>'));
},
});
てな感じで結果は
Benchmark: running split, substr for at least 3 CPU seconds...
split: 4 wallclock secs ( 3.21 usr + -0.01 sys = 3.20 CPU) @ 396900.00/s (n=1270080)
substr: 2 wallclock secs ( 3.11 usr + -0.00 sys = 3.11 CPU) @ 1306832.15/s (n=4064248)
予想通りsubstr圧勝。
996 :
992:04/11/27 18:32:47 ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を
やるとでも思ったか。
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。