Perlコーディング初心者質問スレ Part 38
レス数が1000を超えています。これ以上書き込みはできません。
0001nobodyさん
04/10/07 23:23:08ID:kiEzDCJF【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
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/
0991nobodyさん
04/11/27 12:39:47ID:???$queryから更に別領域にデータ確保するのは何となく抵抗あったな。
でもやっぱりデコードやらコード変換した後に別領域に入れてるよ。
気にスンナ。
0992nobodyさん
04/11/27 18:06:58ID:???と
$hoge = substr($_, 0, index($_, '<>')
はどちらが効率が良いでしょうか。100回ぐらい繰り返します。
0994nobodyさん
04/11/27 18:21:26ID:???0995nobodyさん
04/11/27 18:30:26ID:???終わるから速そう。てことでベンチ。
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圧勝。
0997nobodyさん
04/11/27 18:35:15ID:???やるとでも思ったか。
0998nobodyさん
04/11/27 18:42:11ID:???0999nobodyさん
04/11/28 06:23:22ID:???1000nobodyさん
04/11/28 06:24:21ID:???10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。