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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2007/05/30(水) 11:34:01ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >>2-10

前スレ http://pc11.2ch.net/test/read.cgi/php/1171102883/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
03343262007/07/03(火) 14:43:10ID:8gn4hJb2
>>330
つまりrand 1の返り血が1であることは100%ないということですか?

なるほど。0~1というのは自分の勘違いですね。

>>328
これはどうなるんですか?
-1から始まって0までが選択される?
つまり -1<rand(-1) and 0<=rand(-1) ということですか?
なんかこんがらがりそうorz
03353262007/07/03(火) 14:45:30ID:8gn4hJb2
とりあえず解決していただきましてありがとうございました。
0以上1未満ということで。感謝ですm(__)m
03363282007/07/03(火) 15:51:45ID:???
>>333
そうなの?

use strict;
use warnings;
print rand(-1); # -0.689697265625 が出た。strict も warnings も何も言わない。

>>334
rand(1) が返すのは0以上1未満の値。なので>>330へのお返事についてはそのとおり。
>>328は、上で負数を食わすな的に言われてるから忘れてください。
03373282007/07/03(火) 15:53:35ID:???
連投ごめん。自分で調べろ、と。

perldoc -f rand
> Returns a random fractional number greater than or equal to 0
> and less than the value of EXPR. (EXPR should be positive.)

知らなんだ。>>333ありがとう。
0338nobodyさん2007/07/03(火) 16:08:03ID:???
>>336
望ましい(should be)だから絶対だめというわけではない
ねばならない(must be)ならだめだけど
0339nobodyさん2007/07/03(火) 18:04:35ID:???
ソース見たけど ([0,1)の乱数) * (第一引数) で計算してるので
今の実装なら負でも特に問題なさそう。
03403262007/07/03(火) 22:37:20ID:8gn4hJb2
すいませんおかしなことになりました。多分自分のコーディングにミスがあるはずですが。

# 設定
my $set = 0;

# 各役確率設定別
my @rep = 1/7.29, 1/7.29, 1/7.29, 1/7.29, 1/7.29, 1/7.29;
my @che = 1/39.20, 1/39.15, 1/39.10, 1/39.03, 1/38.99, 1/38.92;
my @mus = 1/5.26, 1/5.22, 1/5.18, 1/5.14, 1/4.95, 1/4.88;
my @zou = 1/168.0, 1/166.3, 1/165.0, 1/162.6, 1/160.6, 1/159.0;
my @bel = 1/291.2, 1/286.1, 1/282.4, 1/275.3, 1/269.7, 1/265.3;
my @big = 1/1598.4, 1/1560.3, 1/1489.4, 1/1424.7, 1/1337.4, 1/1260.3;
my @reg = 1/2259.8, 1/2114.0, 1/1872.4, 1/1771.2, 1/1598.4, 1/1489.4;

# 決定各役確率
my $rep = $rep[$set];
my $che = $che[$set];
my $mus = $mus[$set];
my $zou = $zou[$set];
my $bel = $bel[$set];
my $big = $big[$set];
my $reg = $reg[$set];


# 各初期値
my $medal = 0;
my $in = 0;
my $out = 0;
my $game = 10000;
03413262007/07/03(火) 22:41:20ID:8gn4hJb2
for(my$i=1;$i<=$game;$i++){

# 乱数取得
my $a = 1 - rand(1);

# コインを入れた
$in += 3;

# 取得乱数に応じた挙動
if($a>0 and $a<=$rep){
$out += 3;
}elsif($a>$rep and $a<=$rep+$che){
$out += 4;
}elsif($a>$rep+$che and $a<=$rep+$che+$mus){
$out += 7;
}elsif($a>$rep+$che+$mus and $a<=$rep+$che+$mus+$zou){
$out += 10;
}elsif($a>$rep+$che+$mus+$zou and $a<=$rep+$che+$mus+$zou+$bel){
$out += 15;
}elsif($a>$rep+$che+$mus+$zou+$bel and $a<=$rep+$che+$mus+$zou+$bel+$big){
$out += 350;
}elsif($a>$rep+$che+$mus+$zou+$bel+$big and $a<=$rep+$che+$mus+$zou+$bel+$reg){
$out += 104;
}elsif($a>$rep+$che+$mus+$zou+$bel+$big+$reg and $a<=1){
# ハズレなので何もない
}else{
print "error";
}
}

これを実行したところerrorがprintされてしまうのです。
03423262007/07/03(火) 22:42:43ID:8gn4hJb2
つまり先ほど教えてもらった
my $a = 1 - rand(1);
この方法での乱数取得が
$a>0 and $a<=1;
を満たせない時が存在してることになってしまいます。
単純にそのほかの部分の自分のミスだと思うのですが見つけられません。

アドバイスお願いできますでしょうか?
もしよろしければ上記のコードを数度実行してみて確認もしてみてください。
03433262007/07/03(火) 23:34:12ID:8gn4hJb2
どう思われますか?
activeperl 5.8.1
windowsXP
遅ればせながらこちらの実行環境になります。
0344nobodyさん2007/07/03(火) 23:45:02ID:???
>>342
my @rep = 1/7.29, 1/7.29, 1/7.29, 1/7.29, 1/7.29, 1/7.29;
これは
my @rep = 1/7.29;
に等しいって気付いているか?
0345nobodyさん2007/07/03(火) 23:55:10ID:???
関数のリファレンスから関数名やパッケージ名を取得するにはどうすればいいですか?
0346nobodyさん2007/07/03(火) 23:58:23ID:???
とりあえずerrorになったときは$aの値も表示しろよ
0347nobodyさん2007/07/04(水) 00:07:43ID:???
何やってるコードか全く理解してないうえで、
とりあえず、変数の並びが法則に反してるとこ一か所あるけど、
それで正しいの?
0348nobodyさん2007/07/04(水) 00:11:21ID:???
>>345
そもそも、その関数に名前がついてるとは限らないので不可能。
0349nobodyさん2007/07/04(水) 00:21:06ID:???
なるほどです。
名前がないものは当然取得できないですが、
名前のあるものも取得する手段はないということでしょうか。
03503262007/07/04(水) 00:36:21ID:GRubSazo
>>346
なるほど。確認したところ、0.342-0.343あたりの時にerrorになってるようです。
$musのあたりになるはずですが・・・なんでこんなことになるのでしょう。
>>344
すいません、たまにしか触らないのでどうしても細かい部分は忘れて無難な方法を取りガチです。
>>347
ぜひどこなのか教えてください。
03513262007/07/04(水) 00:41:01ID:GRubSazo
すいません。

}elsif($a>$rep+$che+$mus+$zou+$bel+$big and $a<=$rep+$che+$mus+$zou+$bel+$reg){

ここでしたorz
03523262007/07/04(水) 00:52:15ID:GRubSazo
本当メチャクチャすいませんm(__)m
0353nobodyさん2007/07/04(水) 01:54:39ID:1Rhv3smG
ブログCGIで、削除された記事をパラメータ指定されたときに
404を返したいんですが、その後の表示(ErrorDocument)を
htaccessなどの指定に従う方法はあるでしょうか。
CGIにエラーページを持たせたくないという理由です。
apacheに丸投げできればいいんですが、何らかの方法で
htaccessに指定されたパスを取得して自分で出力してもいいです。
よろしくお願いします。
0354nobodyさん2007/07/04(水) 02:00:20ID:???
リダイレクトするか、読み込んで垂れ流したらいいじゃん。
それ見た10人が10人ともCGIスクリプトが存在しないと思うだろうけど。
0355nobodyさん2007/07/04(水) 02:22:20ID:???
あれ、やっぱりそういうことになります?
例えば、検索ロボットがblog.cgi?a=1を見に行って、404だったら、
blog.cgiが消えたものとしてblog.cgi?a=2もDBから削除するでしょうか。
実際はそんなことしないとは思いますが、
世の中のルール的には、そうされてもやむなしでしょうか。
0356nobodyさん2007/07/04(水) 02:30:20ID:???
400が正しいですね。たぶん。では、400を返すとして。

リダイレクトだと301を返すことにならないでしょうか。
読み込む場合、パスをハードコーディングしたくないのです。
0357nobodyさん2007/07/04(水) 02:41:56ID:???
検索ロボがどれくらい融通をきかせてくれるのかとか
世の中のルール的になんちゃらとかもよくわかんないけど、
とりあえず400は違うだろうし(410のこと?)、301だけがリダイレクトじゃないと思うよ。

つーか、Perlはあまり関係なさそうですよ。

CGI: Common Gateway Interface part 13
http://pc11.2ch.net/test/read.cgi/php/1126436361/
△▲ WebProg 初心者の質問 Part15 ▼▽
http://pc11.2ch.net/test/read.cgi/php/1169725490/
0358nobodyさん2007/07/04(水) 02:53:29ID:???
あれ、すいません。400は確かに違いました。
404でよかったみたいですね。
やっぱり、blog.cgiの設定項目として
ErrorDocumentを指定させるような仕様に
してみようと思います。ありがとうございました。
0359nobodyさん2007/07/04(水) 02:58:38ID:???
print "Status: 404\n\n";
0360nobodyさん2007/07/04(水) 04:31:59ID:???
ごめん、寝ぼけてた。
0361nobodyさん2007/07/04(水) 17:36:06ID:???
サブルーチンの戻り値についての質問です。配列とスカラー変数を戻り値にしたいのですが、
@hogeは値が帰ってくるものの、末尾に2つ空の要素が入り、$hoge1と$hoge2に値を返すことが出来ていません。
このような場合どう記述するのでしょうか?

sub main {
 my (@hoge, $hoge1, $hoge2) = &hogehoge();
}

sub hogehoge {
 return (@ho, $ho1, $ho2);
}
0362nobodyさん2007/07/04(水) 17:41:24ID:???
($ho1, $ho2, @ho)
0363nobodyさん2007/07/04(水) 17:46:44ID:???
>>362
つまり、(@hoge, $hoge1, $hoge2)っていう書き方だと、配列の末尾に値を追加するという意味になってしまうのでダメ
ということでしょうか。

# でも、配列が2つ以上だったらどうするんでしょう…
0364nobodyさん2007/07/04(水) 17:49:00ID:???
リファレンスを返す
0365nobodyさん2007/07/04(水) 17:59:20ID:???
>>364
リファレンスはよくわかってないですが、そういう時に使うんですか。ありがとうございました。

# と、今回は配列1個だけだから、>>362の方法で乗り切りましたw
0366nobodyさん2007/07/04(水) 18:40:00ID:???
リファレンスを返すか、配列を戻り値のケツに持ってくるか。
見た目ならリファレンスのが綺麗かなぁ
0367nobodyさん2007/07/04(水) 19:19:57ID:???
配列が1つとは限らないからリファレンス覚えたほうがいい
0368nobodyさん2007/07/05(木) 04:46:34ID:Ees4tlLi
特定の処理のみでモジュールやライブラリが必要な場合、

1.ソースの冒頭の方で呼び出す
2.その特定の処理の中で呼び出す

どちらが一般的なんでしょうか?
0369nobodyさん2007/07/05(木) 04:55:41ID:???
アマグラマの意見で申し訳ないが、その辺に落ちてるソースだと冒頭以外は見た記憶が無い。
03703682007/07/05(木) 05:16:30ID:???
>>369
配布前提の場合は、ライブラリのパスを設定したり、どのモジュールを使用するかを
利用者に分かりやすく書く必要があるのでまた特別かなと思ったりもするんですが
やはり冒頭にまとめて書くのが普通なんですかね。

めったに使われない処理のためだけにモジュールを毎回呼び出すのって
何か妙に無駄な気がしてしまうんですが、どうなんでしょうか。
0371nobodyさん2007/07/05(木) 05:58:33ID:???
配布目的ならPODやマニュアルを用意するんでしょ?
そこで必要なモジュールや処理の補則をすれば問題ないじゃない
0372nobodyさん2007/07/05(木) 06:25:44ID:???
つかuseはどこに書いてもプログラム実行前に必ず実行されるわけで
03733682007/07/05(木) 06:46:04ID:???
>>372
し・・・知らなかった・・・
は、恥ずかしー
出直してきます。
0374nobodyさん2007/07/05(木) 10:45:56ID:???
処理で分けて読み込むかどうか決めたいなら require でできるけど、
プラグインみたいな使い方じゃない限り素直に読み込ませた方がいいんじゃないかな
0375nobodyさん2007/07/05(木) 11:06:56ID:???
そういうときはrequireを使うんだ!

ってバニング大尉が言ってた
0376nobodyさん2007/07/05(木) 11:33:04ID:???
今更ながらuse strict;の存在に気付いて書き直そうとしてるんだけど、
使ってる変数全部まとめて最初にmy宣言、ってのはアリ?
例えば

$title = 'タイトル';
$hoge01 = '値1';
$hoge02 = '値2';
.......

ってのを
my $title = 'タイトル';
my $hoge01 = '値1';
my $hoge02 = '値2';

とせずに
my ($title,$hoge01,$hoge02);
$title = 'タイトル';
$hoge01 = '値1';
$hoge02 = '値2';

ってやると、何かマズイとこありますか?
あまり美しくない程度ですか?
0377nobodyさん2007/07/05(木) 11:45:14ID:???
俺は趣味の範疇だと思うけど、頭にmyつけるだけのほうがいちいち
変数名しらべて書き並べるより楽じゃない?
0378nobodyさん2007/07/05(木) 11:46:32ID:???
どうせなら
my ($title,$hoge01,$hoge02) = qw(タイトル 値01 値02);
0379nobodyさん2007/07/05(木) 11:52:22ID:???
書き方としては
my ($title,$hoge01,$hoge02);
で問題無し

書き直すなら>>377に同意
03803762007/07/05(木) 12:03:58ID:???
>>377>>379
どっちでも良いと分かって一安心。
前半同じ名前で後半の数字が違うだけ、って変数名が多いんで
調べる手間はそんなかなぁ、と思ってたけど、結局全部網羅するとなると
大して作業量は変わらないかな・・・。

>>378
それはムチャクチャ長くなりそうなんで、ちょっと勘弁w


アドバイス感謝!
03813782007/07/05(木) 12:15:33ID:???
なにも使うのを1つの my で済ませろって意味ではなくて、
my ($authID, $authPASS, $authEXP) = qw(〜); # 認証関連
my ($htmlTITLE, $htmlSUBTITLE, $htmlCSS) = qw(〜);
のように似てるもの同士でまとめて書くのよ
0382nobodyさん2007/07/05(木) 13:21:28ID:rw6MBlh9
Perl上級者です。すいませんラリって幻覚が見えてるので教えてください。
65,536byteは60KB以上で間違いありませんか?
0383nobodyさん2007/07/05(木) 13:23:29ID:???
しゅくだいはじぶんでやろう!
0384nobodyさん2007/07/05(木) 13:49:32ID:rw6MBlh9
またか。このスレで答えてもらったことねーや( ´ ー ` )
答えたことはあるけどな。>>19>>362の二回だけ。

もういいや。ありがとうございます。たしかGNOME電卓にそんな機能が・・・
0385nobodyさん2007/07/05(木) 13:58:27ID:???
use vars
our
0386nobodyさん2007/07/05(木) 14:05:14ID:???
>>384
スレタイ100回音読して半年ラリってろ
0387nobodyさん2007/07/05(木) 14:06:19ID:???
なんだこいつwwwww
0388nobodyさん2007/07/05(木) 14:08:13ID:???
60KB=61440B
0389nobodyさん2007/07/05(木) 14:10:35ID:???
>>380
>前半同じ名前で後半の数字が違うだけ、って変数名が多いんで
俺も変数名で悩んで、そういう名前をつけてしまうことがたまにあるけど、それはやめたほうがいい。
自分の頭の中でも整理がつかなくなってしまうから。

俺は実は、use strict;してないんだけど、変数名を整理して、局在化して書くことだけ気をつけていれば、
仕様書を書かなければ整理がつかないような大きなスクリプトを書くのならともかく、そんなに問題はないと思うけどね。
03903782007/07/05(木) 14:43:43ID:???
割れば分かるだろ割れば・・・
と釣られてみる
0391nobodyさん2007/07/05(木) 17:42:15ID:/MBCt40Z
benchmarkモジュールがうまく動きません。
use Benchmark;
sub test{ 色々 }
timethis(1,&test);

というplファイルをwinのcmdから実行させると、ちゃんとtest内に掛かれてる処理はされてるようなのですが、

timethis 1: 0 wallclock 〜
なんてことになってしまいます。timetheseでやるとちゃんと秒数が出てくるのに。thisだと出ない。
countを10回にしても実際には一杯時間掛かってるのに1分くらい待って出てくる表示は
timethis 10: 0 wallclock 〜

使い方間違ってますか?お助けくださいませ。
0392nobodyさん2007/07/05(木) 22:09:43ID:???
Benchmarkの各関数に渡せるのは
サブルーチンのリファレンスか
evalして実行できる文字列だけだにょ
03933912007/07/05(木) 22:56:26ID:/MBCt40Z
my $csv = Text::CSV_XS->new({ binary => 1 , "always_quote" => 1});
open FH,"bench.txt";
my @line = <FH>;
close FH;

sub test1{
my %get;
while (@line){
$csv->parse($_);my @fields = $csv->fields();
for (my$i=0 ; $i<=1 ; $i++){
$get{$fields[0]}->[$i] = $fields[$i];
}
}
}

sub test2{
my %get0;
my %get1;
while (@line){
$csv->parse($_);my @fields = $csv->fields();
$get0{$_} = $fields[1];
$get1{$_} = $fields[2];
}
}

timethese(100,{ PatternFast => 'test1', PatternSlow => 'test2',});

おかしいんです。今度はこれまでも0.00秒になってしまう。
どこをどう直せばいいのですか?
0394nobodyさん2007/07/05(木) 23:33:45ID:???
> while (@line){

0.00秒になるのは分からんけど
無限ループだにょ
03953912007/07/06(金) 10:06:20ID:oyGEvxOp
>>394
foreachと間違えました。すいません。危うく死亡するところでした。
benchの中で大助かりです。
ところで無限ループが始まった時って賢い対処法はありますか?
いつもはwindowsの終了をやってますが、タスクマネージャあけてアプリケーションの終了させればいいだけなのですか?

とりあえず問題は解決しました。benhの花井で卯s。
なんか数がすくないよってことだったらしいです。50000000とかにしたらようやく比較できました。
0396nobodyさん2007/07/06(金) 18:49:11ID:???
半角全角スペースのみの投稿を拒否したいと思ってます。
if($name eq ""){&er_("名前が未記入");}
if($name eq " "){&er_("名前が未記入");}
if($name eq " "){&er_("名前が未記入!");}


if($name eq "連続する半角全角スペースいっぱい"){&er_("名前が未記入!");}
とやっていくとキリがないです。

そこでパターンマッチ演算子というのを使ってみたのですが↓のであってますでしょうか?
if($name=~ /^ /){&er_("名前が未記入");}#半角スペースが先頭の時
if($name=~ /^ /){&er_("名前が未記入");}#全角スペースが先頭の時

とりあえず判定できてるっぽいですが
もっとスマートな方法があれば教えてください。
0397nobodyさん2007/07/06(金) 19:01:01ID:???
if($name =~ /^( | )*$/){&er_('名前が未記入');}

正規表現ド素人なんであんまり自信ない。
0398nobodyさん2007/07/06(金) 19:03:58ID:???
>>396
フォームに入力される文字がどういう文字なのか(2バイト文字とかを含むのか)とか、
スクリプト中での文字コードの扱いにもよると思うけど、古典的には以下の内容がかなり役立つかと。

http://www.din.or.jp/~ohzaki/perl.htm#JP_RmSpace

# 半角スペース
$space = '\x20';

# 全角スペース
$Zspace = '(?:\xA1\xA1)'; # EUC-JP
$Zspace_sjis = '(?:\x81\x40)'; # SJIS
0399nobodyさん2007/07/06(金) 19:04:41ID:???
>>397
それは2バイト文字の開始位置を誤った場合に誤作動しそう。

連投ごめ
04003962007/07/06(金) 19:07:34ID:???
>>397-399
ありがとうございました。
文字コードについて考えてませんでした。
もう一度見直してみます。
0401nobodyさん2007/07/06(金) 21:30:46ID:???
サブルーチンの質問です。

&hoge($bar);
&hoge($bar{'id'});
&hoge($bar[0]);

sub hoge {
 return $_[0];
}

真ん中の例のように、ハッシュを入れると値が帰ってきません。このような場合に、値を返すようにするには、どう記述するのが
一般的なのでしょうか?(試していませんが、一番下の配列の1要素を入れてもダメかもしれない?)
0402nobodyさん2007/07/06(金) 21:36:05ID:???
shiftしてください
0403nobodyさん2007/07/06(金) 21:46:38ID:???
>>402
&hoge('hoge','hoge');
みたいに呼び出したときに、@_をshiftして呼び出すのはわかるのですが、同じ$_[0]で何故、$barの値は渡るのに、
$bar{'id'}の値は渡らないのでしょうか、という疑問です。
0404401=4032007/07/06(金) 22:04:57ID:???
ごめんなさい。別の部分でポカやってました。
問題は解決しましたが、>>401は依然疑問かも。恐らく
&hoge($bar{'id'});
でも
&hoge($bar[0]);
でも$_[0]に値は入ると思う(思いたい)という、もやもやは残りましたがw
0405nobodyさん2007/07/06(金) 22:20:23ID:???
> ところで無限ループが始まった時って賢い対処法はありますか?
> いつもはwindowsの終了をやってますが、タスクマネージャあけてアプリケーションの終了させればいいだけなのですか?

そんな面倒なことやってるんですか?
パソコンのコンセントを抜くだけですよ!
0406nobodyさん2007/07/06(金) 22:36:49ID:???
レン鯖で今日もまた無限ループやってしまった俺様がきましたよ。
0407nobodyさん2007/07/07(土) 00:38:24ID:???
質問。入力フォームを作っているのですが、postされたデータに対して入力チェックを行い、エラーがある場合は
入力フォームを再度表示して、エラーのある箇所に赤文字でエラーメッセージを出力する。

この板的にはそういうスクリプト書くことが多いと思いますが、そういう場合に便利なモジュールなどはあるのでしょうか?
0408nobodyさん2007/07/07(土) 00:41:55ID:???
>>407
つ rails
0409nobodyさん2007/07/07(土) 08:39:47ID:???
>>399
頭から見て行って、別の文字が混じった時点で失敗するから問題無いのでは?
0410nobodyさん2007/07/07(土) 09:38:06ID:???
ひらがなを半角カタカナに変換する方法はどうしたらいいんでしょうか?
hiraZ2H(STRING)
hiraZ2H(SCALAR REF)
というのが出てきたんですけど使い方がわからないです
0411nobodyさん2007/07/07(土) 10:04:34ID:???
そこまで出て何故悩むんだ…… サブルーチンの使い方が分かんないとか?
0412nobodyさん2007/07/07(土) 10:33:19ID:???
>>411
&jcode'z2h_sjis(\$foo);
で全角の$fooを半角にできました
でもひらがなをカタカナにしないと使えないです
0413nobodyさん2007/07/07(土) 10:53:15ID:???
>>401-404
print qq{$bar \n $bar{id} \n $bar[0]};
sakini kore yatte atai ga tyanto haitteruka checksitemite gomen ime okasiikara konnna kannji dakedo
0414nobodyさん2007/07/08(日) 08:31:07ID:???
>>412
print hira2kata_sjis("あめんぼ赤いなあいうえお");
exit;

BEGIN {
require 'jcode.pl';
my $from_code = 'sjis';
my $kata = 'ァ-ン';
my $hira = 'ぁ-ん';
jcode::convert(\$hira, 'euc', $from_code);
jcode::convert(\$kata, 'euc', $from_code);

sub hira2kata_sjis
{
my $str = shift;

jcode::convert(\$str, 'euc', $from_code);
jcode::tr(\$str, $hira, $kata);
jcode::z2h_euc(\$str);
jcode::convert(\$str, $from_code, 'euc');

return $str;
}
}
0415nobodyさん2007/07/08(日) 11:06:02ID:???
半角カナとダメ文字の扱いに嫌気がさして
shift_jisで書かれたperlスクリプトをeucに変えてるのだけど、
文字コードをeucに変更して保存とjcode.plでshift_jisにしてる部分をeucに変更で
とりあえずは表面的には問題なさそうに見えるのだけど、ちょっと不安。

で、ここから質問なんだけど、他にやっておいた方がいい事とか注意する点とかってあるかな。
0416nobodyさん2007/07/08(日) 11:22:52ID:???
utf8 で書く
化石のようなライブラリを使わない
0417nobodyさん2007/07/08(日) 11:31:27ID:???
charsetの指定ぐらいか。
ぶっちゃけ、どんなスクリプトなのか、どういう人のアクセスを想定しているのか、
ぐらいの情報すら書かずに、ちょこちょこ後出しの駄レスが続くことに嫌気がさしてきた。

不特定多数の携帯からのアクセスがあるならUTF-8はまだダメだろうな。
まぁ、4、5年以上前の携帯だとそもそもEUCもダメなのあるけど。
0418nobodyさん2007/07/08(日) 12:17:04ID:???
???
utf8で書いてshiftjisで吐けばいいじゃん
0419nobodyさん2007/07/08(日) 20:22:14ID:???
レスさんくす。
utf-8はファイルサイズが増えるから・・・って思い込んでたけど思ったより増えないんだね。
これならそっちでも問題ないな。

どんなスクリプトとかアクセス方法によってそんなに変わるもの?
基本抑えておけば色々な場合に対応できると思ってたんだけど、
やっぱノウハウに違いが出てくるのかな。
ちなみにちょっとした掲示板系スクリプトとゲーム系スクリプト混ぜた感じの自作だったり。
アクセス数少ないし多分携帯も問題ない筈。
04204142007/07/09(月) 05:26:23ID:???
>>419
utf8+encodingはバッドノウハウてんこ盛りなので、
もうjcode.pl+EUCで書いててください。
0421nobodyさん2007/07/09(月) 06:10:18ID:???
>>420
jcode.pl+EUCで書いてますがw
perlがいいのは、web上に情報が多いことで、さらに、ある程度化石級の書き方のほうが、
情報量が多くて便利なこともあるような。
0422nobodyさん2007/07/09(月) 10:47:47ID:???
無駄に中途半端な情報も多いけどね。
古いライブラリだと新しい規格に対応してないなど不都合もある。
とりあえずjcode.pl+EUCでいいよ
0423nobodyさん2007/07/12(木) 01:50:40ID:???
speedycgiというのを試してみたのですが、どうしてもrequireしたものが
2度目以降に動作しません。テスト用のpmファイルでは変数は一切使っておらず、
ただprint "test2"としているだけですが、最初の1回だけ出力されます。
main側もただtest1とだけ出力していますが、こちらは毎回出力します。
どのような原因が考えられましょうか。
0424nobodyさん2007/07/12(木) 01:56:28ID:???
サーバ上に置いたファイルをCGIから改名(拡張子含み)させたいのですが、perl関連のページを漁っても
見つかりませんでした…
どうかよろしくお願いしますm(_ _)m
04254232007/07/12(木) 02:01:32ID:???
speedycgiの件、下記のようなコードです。なお、-r1オプションでは正しく動きます。
よろしくお願いします。
#!/usr/bin/speedy -w

use strict;
use warnings;
print "Content-type: text/plain; charset=utf-8\n\ntest";
require './lib/test.pm';

# test.pm
package test; print 'test2'; 1;
04264232007/07/12(木) 02:04:16ID:???
>>424
http://72.14.235.104/search?q=cache:7-pqqTdFRYgJ:www.kent-web.com/perl/chap6.html+perl+%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%82%92%E5%A4%89%E6%9B%B4&hl=ja&ct=clnk&cd=1&gl=jp
0427nobodyさん2007/07/12(木) 02:39:07ID:???
>>425
キャッシュされてるだけのような。
関数で呼び出すようにしたら、どうなん?
0428nobodyさん2007/07/12(木) 02:42:41ID:???
>>426
rename関数を使うのですね。ありがとうございました!
04294232007/07/12(木) 03:13:50ID:???
>>427
関数だとちゃんと出力されました。
グローバル変数の初期化から前述のコードに迷い込んだのですが、
要するに初期化もパッケージの直下にour $a = 0なんて書くのではなく、
INITとか初期化用関数とかを用意しないとならないのですね。
グローバルという言葉をよく理解できてないようです。勉強します。
ありがとうございました。
0430nobodyさん2007/07/12(木) 15:38:50ID:???
携帯電話向けの物なのですが、formで値(例えばapple)を送信すると
http://www.au.kddi.com/test.cgi?atai=apple
のように、受け取った値を利用したURLにアクセスさせたいのですが、

今はやり方が分からずアンカータグを返して1クッション置いているのですが、ダイレクトで表示させるにはどのようにすれば良いのでしょうか?

よろしくお願いします。
0431nobodyさん2007/07/12(木) 16:13:05ID:???
例の通りで良いなら普通にGETじゃだめなの
それでダメならLocationなりで飛ばせばいいじゃない
0432nobodyさん2007/07/12(木) 18:46:36ID:???
jcode.pl関連で質問します。
文字コードをEUC-JPに変換して半角文字を全角文字に変換する場合、

&jcode::convert(\$value,"euc","","z");

これと

&jcode::convert(\$value,'euc');
&jcode::h2z_euc(\$value);

これは、
同じなんですか?
後者のはよく見かけるんですが、
前者のはあまり見かけないような印象があるんですが
何か理由があるのでしょうか?
04334322007/07/12(木) 18:51:01ID:qGszHv4Y
連投すみません。
質問なのにsageてしまったのでage直します。
■ このスレッドは過去ログ倉庫に格納されています