Perlコーディング初心者質問スレ Part 38

このエントリーをはてなブックマークに追加
949944:04/11/24 17:31:19 ID:???
>> 948
画面のスクリーンショットを取得できるんですか?
もう少しマニュアル読んでみます。
950nobodyさん:04/11/24 17:33:37 ID:???
いや、>>944 の言いたいことは、
HTMLレンダリングしたページイメージを取得したい、
という話らしい。

>>946 の言ってるとおり、それは LWP とか「取得」とかいう問題ではなく、
LWP で取ってきたデータをローカルでレンダリングするにはどうしたら、
という話になるわけだが。

必要なデータを渡すと gecko 使ってレンダリングして
Image::Magick オブジェクトを返してくれる、
とかいうモジュールがあるといろいろ便利そうではあるが、
かなり難しそうだわなあ。
951nobodyさん:04/11/24 20:28:29 ID:???
>>950
http://www.babysimon.co.uk/khtml2png/
こういうのを利用するといいんでは。
モジュールではないし、XやQt、KDEに依存するけど…。
952nobodyさん:04/11/24 22:05:26 ID:???
そこのリンクにある、
http://marginalhacks.com/Hacks/html2jpg/
こっちはPerlスクリプトだね。
X+Mozilla+ImageMagickかな。
953nobodyさん:04/11/24 22:19:47 ID:???
html2[jpg,bmp,png,ps etc.] でググれば結構見つかるよね。
大体がブラウザにレンダリングをさせて画面をキャプチャーするタイプ。
他にも、Windows限定だけど web制作板のCSSでイケてるかも知れないデザインサイトスレで
使っているwebnailとか。
954nobodyさん:04/11/25 00:19:16 ID:???
デスクトップ環境構築してるなら、数行のShellスクリプトで済むけど。
サーバー側で使うとなると、ちょっと敷居高いんじゃないかな。
955nobodyさん:04/11/25 00:33:25 ID:???
あるディレクトリ内のファイル名一覧を取得する時って、
opendir,readdirかFile::Findかどちらを使うべきだろう。
1000ファイルほどあるんですが、パフォーマンス的には変わりませんかね?
(ファイルは階層的に掘り下げる必要は無いんですが)
956nobodyさん:04/11/25 01:11:28 ID:???
@array = ('aaa','bbb','ccc');
$key = 'bbb';
このような変数があるとして、$keyが@arrayの要素に存在するかどうかを
一発で判定する書き方って無いでしょうか?
957nobodyさん:04/11/25 01:12:46 ID:???
(;゚Д゚)
958nobodyさん:04/11/25 01:22:03 ID:???
>>956
釣りですか?
959nobodyさん:04/11/25 01:24:36 ID:???
いえ、ループとか制御構文使わないで、1行ですっきり判定する方法ないかなーと・・・
960nobodyさん:04/11/25 01:27:59 ID:???
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
961nobodyさん:04/11/25 01:46:49 ID:???
map使えば簡潔に書ける。と思うが。
962nobodyさん:04/11/25 01:50:38 ID:???
ていうか連想配列でif($array{$key}){処理;}とかでいいじゃない。
963nobodyさん:04/11/25 01:56:17 ID:???
>>955
単一階層なら 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';
964nobodyさん:04/11/25 02:08:03 ID:???
>>963
むお!ありがとうございます!
965nobodyさん:04/11/25 08:14:06 ID:???
>>956
my $count = grep{ $_ eq $key } @array;

# 中身はループだけどね。
966nobodyさん:04/11/25 08:26:21 ID:???
最近CGI.pm使い始めたんだけど、もしかして重いですか?
cgi-libでReadParseして%inを取り回してた方が負荷的にも鯖にやさしい?
967nobodyさん:04/11/25 11:25:21 ID:???
さあ?ってか必要なのだけインポートしなよ。
968nobodyさん:04/11/25 12:32:23 ID:???
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、
import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。

俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
969nobodyさん:04/11/26 02:05:36 ID:???
Template Kit重いのかー。
ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
970nobodyさん:04/11/26 08:03:16 ID:???
掲示板で、データを順番に、任意のハッシュに入れたいのですが、

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(/<>/) からストレートにハッシュに格納することは難しいでしょうか。
971nobodyさん: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に含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース

+なまえ+ → {+}なまえ{+}
%^なまえ^% → {%}{^}なまえ{^}{%}

こんな感じです。始めは上手くいっていたのですが不具合をみつけました。
"タ"や"ミ"、全角の"+"などです。

"タ"や"ミ"は"ボ^}"と置換されていまい、全角の"+"は"+{}"と置換されてしまいます。
ご指摘、アドバイス等いただければ幸いです。
972nobodyさん:04/11/26 09:55:48 ID:???
>>971
文字コードをEUCにして下さい。
SJISだと他にも同じような事がいっぱい起こります。
973nobodyさん:04/11/26 10:23:37 ID:???
>>970
ハッシュのスライス使って

@data{@data_list} = split(/<>/);

あたりでどうすか?
974970:04/11/26 10:48:29 ID:???
>>973
ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
975971:04/11/26 11:00:48 ID:???
>>972
ありがとうございます。
文字コードEUCについて調べてみます。
976972:04/11/26 13:09:04 ID:???
>>971
そういえばSJISでも、
s/\Q([\x20(){},+^~%`])\E/{$1}/g;
だったら大丈夫かも…。

まぁ、EUCにもしておいた方が無難。
977nobodyさん: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
978nobodyさん:04/11/26 14:49:58 ID:???
さげ忘れ…すいませんorz
979nobodyさん:04/11/26 14:56:31 ID:???
syntax error at enquete.cgi line 21
と出たときの8割は
20行目の行末のセミコロンを付け忘れている
980nobodyさん:04/11/26 15:01:55 ID:???
>>977
21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。

おおかたopen 〜 || die 〜の行の最後にセミコロンがない
せいだとは思うがナ。
981nobodyさん:04/11/26 15:04:08 ID:???
なんと…三十分も見落とし続けてた…お恥ずかしい●| ̄|_
解決しました、ありがとうございましたorz
982nobodyさん:04/11/26 15:05:38 ID:???
>>980
改行が多すぎると出たので改行も消してました。
重ね重ね申し訳ないorz
983nobodyさん:04/11/26 18:13:14 ID:???
実行ステップ数は変わらない場合、1ソースよりも、ソース分割して必要に応じて
requireしていく方が速いでしょうか?
984nobodyさん:04/11/26 18:17:30 ID:???
use Benchmark;
985nobodyさん:04/11/26 18:46:45 ID:???
実行ステップ数が変わらないんじゃたいして意味無いと思うぞ。
昔は、BBSのスクリプトとかで、表示、書き込み、検索でcgi自体を分けたりしてた頃もあったなぁ。
でも最近はベタ書きばかりだけど。
javaではしっかりモデリングするんだけど、言語によって人格変わる。
986nobodyさん:04/11/26 19:09:23 ID:???
>>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
大丈夫ではありません。
987nobodyさん:04/11/27 08:15:26 ID:???
次スレキボン
988nobodyさん:04/11/27 10:19:32 ID:???
CGI.pmの場合、$query->param(hoge);とかでフォームからの入力データを参照できますが、
タグを無効にしたり文字コード変換したりしますよね?
この場合、新たなハッシュテーブルなりに入れるか、$queryを直接書き換えるか、
どんな風にデータを取り回してますか?
私は色々変換した後に新たなハッシュテーブルに入れて、それを以降の処理で使うようにしてますが、
何だか領域が勿体無い気もします。
989nobodyさん:04/11/27 11:30:32 ID:???
>>988
Perlスクリプトである以上、メモリを使うのはしょうがないよ。
掲示板のログをまるごと配列に入れるのは論外だけど、
通常の操作なら(・ε・)キニシナイ
990nobodyさん:04/11/27 11:38:48 ID:???
新スレ

Perlコーディング初心者質問スレ Part 39
http://pc5.2ch.net/test/read.cgi/php/1101522903/
991nobodyさん:04/11/27 12:39:47 ID:???
cgi-lib使ってた頃は%inを直接いじってたので、CGI.pmに乗り換えた時に
$queryから更に別領域にデータ確保するのは何となく抵抗あったな。
でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。
気にスンナ。
992nobodyさん:04/11/27 18:06:58 ID:???
($hoge) = split(/<>/)



$hoge = substr($_, 0, index($_, '<>')

はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
993nobodyさん:04/11/27 18:17:37 ID:???
>>992
100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
994nobodyさん:04/11/27 18:21:26 ID:???
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
995nobodyさん:04/11/27 18:30:26 ID:???
ぱっと見、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圧勝。
996992:04/11/27 18:32:47 ID:???
>>993-995
ありがとうございます。ミリ秒を測る手段を探していました……。
997nobodyさん:04/11/27 18:35:15 ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を
やるとでも思ったか。
998nobodyさん
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。