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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん04/10/07 23:23:08ID:kiEzDCJF
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

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

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0967nobodyさん04/11/25 11:25:21ID:???
さあ?ってか必要なのだけインポートしなよ。
0968nobodyさん04/11/25 12:32:23ID:???
CGI.pm は実際に呼び出された関数だけコンパイルする仕様なので、
import するかどうかはあんまり負荷に影響しない。
-compile :all とかするとさすがにアレだが。

俺も CGI.pm のコンパイルは若干重めだと思うが、
Template Kit や DBI の重さに比べれば誤差なので、
遠慮なく使っている。
それに mod_perl 環境下ではコンパイル負荷をほぼ無視できるしな。
0969nobodyさん04/11/26 02:05:36ID:???
Template Kit重いのかー。
ヒアドキュメントだらけでなんとかしたかったんだが、やめとくか。
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:hJWQX2yr
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi とwin2000を使っています。

my $Name_T = '';
$Name_T =~ s/([\x20(){},+^~%`])/{$1}/g;

いろいろ試してこのような正規表現で以下の文字が$Nameに含まれている場合{}をつけて置換しようとしました。
(){},+^~%` とスペース

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

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

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

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

あたりでどうすか?
097497004/11/26 10:48:29ID:???
>>973
ありがとうございます。無事考えていた処理ができました。
スライスというものを使えばいいのですね……知りませんでした。
097597104/11/26 11:00:48ID:???
>>972
ありがとうございます。
文字コードEUCについて調べてみます。
097697204/11/26 13:09:04ID:???
>>971
そういえば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:???
さげ忘れ…すいませんorz
0979nobodyさん04/11/26 14:56:31ID:???
syntax error at enquete.cgi line 21
と出たときの8割は
20行目の行末のセミコロンを付け忘れている
0980nobodyさん04/11/26 15:01:55ID:???
>>977
21行目で構文エラーだって書いてあるんだから、どこがその
行か示せよ。そのコピペは20行ないからソースそのままじゃ
ないので意味ナシ。

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

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



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

はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
0993nobodyさん04/11/27 18:17:37ID:???
>>992
100回ぐらいならどっちでもいいと思うが気になるなら
ベンチ取れよ。$_がどういう文字列かにもよりそうでは
ある。
0994nobodyさん04/11/27 18:21:26ID:???
100回程度ならまず差は出ないだろう。気にするな、それがパールの世界だ。
0995nobodyさん04/11/27 18:30:26ID:???
ぱっと見、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圧勝。
099699204/11/27 18:32:47ID:???
>>993-995
ありがとうございます。ミリ秒を測る手段を探していました……。
0997nobodyさん04/11/27 18:35:15ID:???
インタプリタが左辺の変数を数えて、splitはその分だけサーチするなんて事を
やるとでも思ったか。
0998nobodyさん04/11/27 18:42:11ID:???
ベンチってオモロイから良くやるけど実用上意味が無い場合が多いな。
0999nobodyさん04/11/28 06:23:22ID:???
埋めないの?
1000nobodyさん04/11/28 06:24:21ID:???
1000ならperlの2〜3年で衰退。
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。