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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2006/06/26(月) 00:46:38ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0796nobodyさん2006/07/20(木) 18:19:15ID:???
良い悪いは別にしてデータファイルに*.cgiという拡張子をつけるのはおかしいだろw
あえてソコだったんだがただのかわいそうな人になってしまったw
0797nobodyさん2006/07/20(木) 18:20:27ID:???
>>796
おかしくないよ
他人に見せないためにも*.cgiにしたほうがいいと思うよ。
07987872006/07/20(木) 18:25:43ID:gqKAMnqO
またしても即答ありがとうございます。
>>795さんのいうとおりにしたら
error500

CGIエラー-Content-Typeヘッダが正しくありません。

とでてしまいました。これはどういうことでしょうか?
0799nobodyさん2006/07/20(木) 18:25:51ID:???
>データファイルに*.cgiという拡張子を付けることがおかしいだろw
おかしいと思う理由が知りたいんだが
0800nobodyさん2006/07/20(木) 18:27:34ID:???
combbslog.cgiのパーミッションは適切か確認汁
0801nobodyさん2006/07/20(木) 18:29:28ID:???
CommonGatewayInterfaceなファイルではないからおかしいという理論
っつーかもう触れないでくれw
どおりで俺の冗談には誰も笑わないわけだ
0802nobodyさん2006/07/20(木) 18:32:24ID:???
>>801
冗談にして逃げるわけねw
0803nobodyさん2006/07/20(木) 18:32:45ID:???
> local(@file) = <IN>;
> close(IN);

> local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);

$_ に何入ってんだよwww

foreach (@file) {
local($no,$dat,$nam,$eml,$sub,$com,$url,$hos,$pw,$tim,$rl,$yl,$gl,$wl,$bl) = split(/<>/);
・・・
}

こうしたいんじゃねえのかい?
0804nobodyさん2006/07/20(木) 18:33:56ID:???
ああん更新し忘れた(ノ∀`)ペチ
0805nobodyさん2006/07/20(木) 18:34:18ID:???
>>798
print "Content-type: text/html\n\n";
を出力の前に入れないと駄目でしょ。

それと>>793が全文だとすると、sub error はいずこへ
0806nobodyさん2006/07/20(木) 18:35:10ID:???
>>802
逃げさせてくださいw
0807nobodyさん2006/07/20(木) 18:35:31ID:???
>>798
ブラウザでやってんの?

なら
つ【print "Content-type: text/html;\n\n"】
0808nobodyさんNGNG
突っ込み所が多すぎて
08097872006/07/20(木) 18:41:17ID:gqKAMnqO
はい、ブラウザでやってます。AN HTTPD というソフトでローカルチェックしてるところですから
パーミッションの設定はまだ関係ないですよね。
08107872006/07/20(木) 18:44:23ID:gqKAMnqO
突っ込みどころ多くて申し訳ないです。

>>803さんや>>805さんのとおりにしてみたらエラーは出なくなりました。
ただ何も出力されてきません。
0811nobodyさん2006/07/20(木) 18:48:34ID:???
デバック方法は自分で考えなよw

とりあえず
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
print <IN>;
close(IN);

とかからやってみたら。
あと無意味に local 使ってるのが kentくさくてイヤ。
08127872006/07/20(木) 18:51:54ID:???
>>811さん
  はい、デバックは自分で頑張ってみますね。
Kentさんのところをすごく参考にしていたのでそうなってしまいました。
08137872006/07/20(木) 18:55:45ID:gqKAMnqO
はやくもまた質問で申し訳ないのですが
ファイルを読み込むとき
最初の一行だけを読み込むとか出来ますか?
08147892006/07/20(木) 18:57:06ID:???
今日はみんな親切だな。
まあ雨がひどいからな。

0815nobodyさん2006/07/20(木) 18:58:03ID:???
open(IN,"combbslog.cgi") || &error("Open Error: combbslog.cgi");
$data = <IN>;
close(IN);
0816nobodyさん2006/07/20(木) 19:00:43ID:???
親切だなw

もう俺なら 「どこの講座でもいいから一回全部読んで来い」 っていう。 >>576 のでもいいから。
08177872006/07/20(木) 19:02:37ID:???
ほんとうに親切にありがとうございます。
雨の日でよかったです。
08187872006/07/20(木) 19:18:46ID:???
望んでいた事が出来ました!!
本当にありがとうございました。
花火大会を中止に追い込んだにっくき雨でしたが、
いまでは感謝しています
0819nobodyさん2006/07/20(木) 19:47:26ID:???
とかいって、回答者の実に半数は晴れでも出かける予定はなかったり・・・
0820nobodyさん2006/07/20(木) 19:56:23ID:???
ここまで話がはずんだのは>>788のおかげだとオモ
0821nobodyさん2006/07/20(木) 20:18:14ID:???
照れるじゃまいか
0822nobodyさん2006/07/20(木) 23:14:01ID:???
しかしあれだよな。
IE7って最高だな。
0823nobodyさん2006/07/20(木) 23:25:57ID:???
Acid2もクリアできないブラウザは嫌いだ
0824nobodyさん2006/07/20(木) 23:27:54ID:???
Perl7もたぶん最高
0825nobodyさん2006/07/20(木) 23:55:28ID:???
実装も存在しない言語は嫌いだ
0826nobodyさん2006/07/21(金) 01:52:13ID:VvqLR3Fu
コードの中で、自分自身が書かれている行数(行位置)を知ることはできるでしょうか。
例えば、「この文字列はindex.cgiの563行目で出力されました」と動的に出力できますか?
0827nobodyさん2006/07/21(金) 01:53:59ID:???
print __LINE__, "\n";
0828nobodyさん2006/07/21(金) 01:56:42ID:???

1: 自分は明日休みで暇だから・・・
2: なんかおまいらにコーディングの問題でも出して・・・
3: みようかな・・・

問題
・DATログをGrepして表示する
・検索語は任意の文字
・表示方法は100個づつ

最速コーディング達成者には妹の入浴画像を賞品(ry
0829nobodyさん2006/07/21(金) 02:00:29ID:???
>>827
おお!感動しました。そんな簡単にできたんですね。
エラー処理関数内でdieしたらデバッグの役に立たない行数がログに残るので
その対策をと考えておりました。ありがとうございます!
0830nobodyさん2006/07/21(金) 02:16:23ID:???
>>829
そういうことなら最後に改行を付けなさい。それで消えるから。
08318302006/07/21(金) 02:20:35ID:???
あ、ごめん。なんか凄い勘違いしたきがする。
呼び出し元の行をログに書きたいならcaller関数をあたると良い。後Carpモジュールも
0832nobodyさん2006/07/21(金) 02:24:01ID:???
あ、すみません、分かりづらくて。
丁度、callerを発見して感動して、その報告をしに来たところでした。
ありがとうございます!
0833nobodyさん2006/07/21(金) 03:50:54ID:???
ちょっと感動しすぎだろ
0834nobodyさん2006/07/21(金) 10:04:09ID:???
今日も雨だな・・・・
注文こねえかな
0835nobodyさん2006/07/21(金) 10:25:40ID:???
1.list.txtというファイルを読んで、一行ずつチェックボックスにするcgiを作ろうと思いました。
チェックされた項目は別ファイルに時刻付きで書き出すつもりでした。
2. ttp://marco.s4.xrea.com/cgi-bin/check/check.cgi
 を元にいろいろ変えて見てます。
3.入力フォームからpostでデータを渡して、表示上はどのチェックボックスもオンではないのに、
ブラウザをリロードすると、前にチェックされたデータが再度チェックされてます。
これは、どうしてでしょうか?
初心者で、不具合をうまく言えなくてごめんなさい。またこちらでの書き込みが不適切でしたら、該当スレをご教示いただければ有りがたく存じます。

下記は、ソースの一部分です。
print "<form action=$script method=post>\n";
print "<tr><td bgcolor=$page_color><font color=$bg_color>Check</font></td>\n";
print "<td bgcolor=$page_color><font color=$bg_color>項目</font></td></tr>\n";
open(LST,"$listfile");
@LIST=<LST>;
close(LST);
$cnt=0;
foreach (@LIST){
chomp($_); #chomp 行末の改行を削除
$cnt++;
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
}
print "</table>\n";
print "<input type=hidden name=checkcnt value=$cnt>\n";
print "<input type=submit value=送信>\n";
print "</form>\n";
 
0836nobodyさん2006/07/21(金) 10:31:20ID:???
http://pc8.2ch.net/test/read.cgi/php/1143834740/
http://pc8.2ch.net/test/read.cgi/php/1141174205/
0837nobodyさん2006/07/21(金) 10:43:47ID:???
>>828
すまんが問題の意図が掴めん。

そして妹の入浴姿より姉の下着姿のほうがやる気が出る。
0838nobodyさん2006/07/21(金) 12:09:34ID:NKhAgGvd
本当にくだらないことで申し訳ないのですが、
入力されたURLが正しいURLかを判断するソースはどのようになるのでしょうか?
メールアドレスを判断するスクリプトは何とか分かるのですが、
URLとなると・・・どのようにしたらよいか・・・・
0839nobodyさん2006/07/21(金) 12:17:55ID:???
>>838
ttp://www.din.or.jp/~ohzaki/perl.htm#httpURL
まあここまでやらなくてもいいと思うが
0840nobodyさん2006/07/21(金) 12:19:14ID:???
>>838
>>9
テンプレの過去ログ部分うぜえな
0841nobodyさん2006/07/21(金) 12:25:52ID:???
「『URI』?ぷっ、それって『URL』のこと?『url』と『uri』見間違えてそのまんま覚えてやんのw」
とよくバカにされるんですが、どうしたら良いでしょうか?
0842nobodyさん2006/07/21(金) 12:30:03ID:???
>>841
スレ違い、そしてその人は無知
ttp://www.kanzaki.com/docs/html/htminfo-uri.html#uri
ttp://www.alib.jp/html/uri.html
0843nobodyさん2006/07/21(金) 12:31:22ID:???
まじめに説明するのは疲れるので相手を見て使い分け。
0844nobodyさん2006/07/21(金) 12:59:56ID:???
そして葛藤しろ
0845nobodyさん2006/07/21(金) 15:15:48ID:???
下のコードが無限ループになるのはなぜでしょう?

--ここから--
my $param = '123a456';
my $n = '';
for (;;) {
$param =~ s/[0-9]+//;
$n = defined($&) ? $& : '';
print 'debug $n='.$n.' $parm='.$param."\r\n";
last if ($n eq '') ;
}
print 'end';
--ここまで--

とりあえず for(;;0) のように第三パラメータになんでもいいから
突っ込めば $& が再評価されてループを抜けるのはわかったが、Bad
Know-How くさいので正しいコードを誰か教えて。
0846nobodyさん2006/07/21(金) 15:33:56ID:bw5ViySC
「スペース(全角・半角問わず)があれば、そのスペースも含めてそれ以降の文字列を全て除去」
というのを正規表現で書くとどうなりますか?
0847nobodyさん2006/07/21(金) 15:36:13ID:???
ちょっとは考えろ
こうやったけどこうなってできませんでした、とか
0848nobodyさん2006/07/21(金) 15:39:23ID:???
>>845
$&はThe string matched by the last successful pattern match なので
マッチしなくて置換が行われなかったときに値が変わるのを期待する方が
危険な気がする。s///は置換に成功したかどうかを返すのでそれで分岐
するのが筋じゃないかと。

forの第三パラメタがあったときに値が変わるほうがむしろ不思議だな。

どっちにしろ成功したパターンマッチのすぐ後以外のところでマッチ関係の
変数($<数字>とか$&とか)を使うのは怖いので自分ならしない。
08498462006/07/21(金) 15:49:32ID:bw5ViySC
考えてみたものの分かりませんでした。
$moji =~ s/ / /g;
my ($temp undef) = split(/ /,$moji);
08508452006/07/21(金) 16:05:32ID:???
>>848
サンクス
$& はマッチしなかった場合 undef になるというのをどっかで読んだんだが。
defined($&) の条件分岐はしないほうがいいてこと?でも for(;;0)のときには
ちゃんと評価されるのが謎なんだよな。
0851nobodyさん2006/07/21(金) 16:08:33ID:???
>>845
perl -MO=Deparse foo.plで for(;;) とfor(;;1)を比べてみたが、

for(;;)の方は単純に

while(1) { ... }

になるのに対して、for(;;1)の方は

while (1) { do { ... }; '???'; }

となってループ内の実行文がdo ブロックの中に入るかたちに
なっていた。このためfor(;;)の方では最後に成功したマッチが
456の置換になるのに対して、for(;;1)の方ではこのループに入る
前(一度もないのでundef)になるのだろうと思われる。

ちなみに、プログラムの先頭に 'hoge' =~ /.*/; を追加して
for(;;1)を試すと3回目からhogeになる。
08528452006/07/21(金) 16:35:45ID:???
ちょっと動作はちがうけど、これでいいのか。ありがと。
my $param = '123a456';
my $n = '';
while (1) {
last unless ($param =~ s/[0-9]+//);
$n = $&;
print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0853nobodyさん2006/07/21(金) 17:08:27ID:???
普通whileに入れちゃうんじゃないかな
my $param = '123a456';
my $n = '';
while ($param =~ s/[0-9]+//) {
 $n = $&;
 print 'debug $n='.$n.' $parm='.$param."\r\n";
}
print 'end';
0854nobodyさん2006/07/21(金) 18:08:00ID:???
>>849
絶対こいつは考えてない
0855nobodyさん2006/07/21(金) 18:24:05ID:???
s/>>846|>>849//g;
0856nobodyさん2006/07/21(金) 18:49:30ID:???
>>846
s/\s.*//; かな? split を使うなら、第三引数に1がいいかも

>>853
my $param = '123a456';
while ($param =~ s/([0-9]+)//) {
 print 'debug $n='.$1.' $parm='.$param."\r\n";
}

$& を使うと全体が遅くなるから、キャプチャした方が良くない?
0857nobodyさん2006/07/21(金) 19:06:38ID:???
まあ速さについては前レス嫁ってことだなー。
0858nobodyさん2006/07/21(金) 20:22:51ID:???
cgiなのに速さ?
余程凄いもん作るわけ?

俺はちょくちょく書き換えるから最適なコードなんて求めない。
早く仕上げることの方が面白いしね。
漫画みたいにズダダダダダーって物事を進めていくのが面白いんだよ。

っていうか画像サイズとかをかんぺきにするだけでじゅうぶんだそ。
0859nobodyさん2006/07/21(金) 20:47:36ID:???
日本語でおk
0860nobodyさんNGNG
速い方が気分が良い
0861nobodyさん2006/07/21(金) 21:41:57ID:???
>>858
( ´,_ゝ`)プッ
0862nobodyさん2006/07/21(金) 23:54:16ID:???
>>858
>>858
>>858

0863nobodyさん2006/07/22(土) 01:07:15ID:???
ズダダダダダー
0864nobodyさん2006/07/22(土) 01:25:10ID:???
速くしたいなら画像サイズとかをかんぺきに!
0865nobodyさん2006/07/22(土) 01:29:11ID:???
↓そろそろ>>858が「大量に釣れた(藁」とか書き込む
0866nobodyさん2006/07/22(土) 05:06:31ID:???
ちょっとコーディングの質問なんですが

foreach $test (@test){
print "$test";
}

と

foreach $test (@test){
$test .= $test;
}
print "$test";


とではどちらが鯖負担の軽減、高速化になりますか?
0867nobodyさん2006/07/22(土) 05:30:37ID:???
>>866
上。だってやってること違うじゃん。
foreachよりforの方が速いから、上の方のもっと速くするには
for(@test){
print;
}
0868nobodyさん2006/07/22(土) 05:33:09ID:???
grepについて質問です。
agroupeの要素がbgroupeに含まれていれば、ok!と出力し、
入っていなければ、その要素を出力するスクリプトがうまくいきません。
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for(@agroupe){
if(grep(/^$_$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
これでやると全部入っていることになっちゃうんですが、どこが間違ってるでしょうか。
0869nobodyさん2006/07/22(土) 05:40:00ID:???
>>868
@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);
for my $word (@agroupe){
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $_, "\n";
}
}
0870nobodyさん2006/07/22(土) 05:43:37ID:???
でも grep でいちいち探していたら時間がかかるので、一旦ハッシュに入れる事をオススメします。

@agroupe=qw(quit exit login logout);
@bgroupe=qw(exit quit);

my %bgroupe = map { $_ => 1 } @bgroupe;
for (@agroupe){
  if(exists $bgroupe{$_}){
    print "ok!\n";
  } else{
    print $_, "\n";
  }
}
0871nobodyさん2006/07/22(土) 05:47:20ID:???
>>869
ありがとうございます。
そうか、grepの場合、$_にはそのループのデフォの$_じゃなくて
比較対象の要素が入ってるんですね。前も引っかかったのに忘れてて
小一時間損したぁぁ。
ちなみに
if(grep(/^$word$/,@bgroupe)){
print "ok!\n";
} else{
print $word, "\n"; # print $_, "\n";だと何も出てこない!
}
0872nobodyさん2006/07/22(土) 05:49:11ID:???
>>870
ハッシュを使えば速いんですね。確認しました。ありがとうございました。
0873nobodyさん2006/07/22(土) 09:05:18ID:???
>>835
本当にそのコードなんだったらチェックは付かない。
しかし実際は、そのコードからは出力されるはずのない
<tr><td><input type=checkbox name=chk1 value=1 checked></td><td>洗顔</td></tr>
という行が出力されている。(checkedの部分が問題
つまり
print "<tr><td><input type=checkbox name=chk$cnt value=1";
print "></td><td><b>$_</b></td></tr>\n";
の2行の間に「すでにチェックされたかどうか」を判定するコードが実際には入ってると考えられる。
その部分のコードを削除すればたぶんOK
0874nobodyさん2006/07/22(土) 17:39:40ID:???
そろそろ
my $foo = "hoge";
print "$foo";
みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
>>866 みたいなやつ。

ダブルクォートで囲うと新しい文字列を作る事になるから
上のような場合は、ただの無駄にしかならない
($fooと全く同じ文字列を作って表示している)。

一体、どこで習ってくるんだろう。
KENTもそこまで酷くないよね?
0875nobodyさん2006/07/22(土) 17:41:47ID:???
このスレって日によって温度差かなりあるよね。
0876nobodyさん2006/07/22(土) 18:08:55ID:???
最適化されて消えるでしょ。
$fooと同じ文字列をわざわざ作るなんて馬鹿なコンパイラはない。
0877nobodyさんNGNG
ベンチ取ったら5倍も違ったー
0878nobodyさん2006/07/22(土) 18:50:39ID:???
>>876

$ perl 876.pl 2>/dev/null
Benchmark: timing 1000000 iterations of bare, quote...
bare: 2 wallclock secs ( 0.78 usr + 0.53 sys = 1.31 CPU) @ 762776.51/s (n=1000000)
quote: 1 wallclock secs ( 0.96 usr + 0.56 sys = 1.52 CPU) @ 657030.22/s (n=1000000)

$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{'quote'=>sub {print STDERR "$foo";},
'bare'=>sub {print STDERR $foo;},
});
0879nobodyさん2006/07/22(土) 18:55:33ID:???
DWIMの言語なわけで、プログラマーのわがまま通りにかけるのも
魅力のひとつだと思う・・・
0880nobodyさん2006/07/22(土) 19:40:53ID:???
$ perl 876.pl
Benchmark: timing 1000000 iterations of bare, quote...
bare: -1 wallclock secs ( 0.11 usr + 0.00 sys = 0.11 CPU) @ 9090909.09/s (n=1000000)
(warning: too few iterations for a reliable count)
quote: -1 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 5000000.00/s (n=1000000)
(warning: too few iterations for a reliable count)
$ cat 876.pl
use Benchmark;

my $foo = 'bar';
timethese(1_000_000,
{
'quote'=>sub {$boo="$foo";},
'bare'=>sub {$boo=$foo;},
});
printしないとこんなかんじ
0881nobodyさん2006/07/22(土) 21:43:50ID:???
>>876
"" で括るのは、新しい文字列の生成という意味だから、最適化はされないよ。
-MO=Deparse 付けてみても、"$foo" そのまま。
0882nobodyさん2006/07/23(日) 01:44:22ID:NrRWf3Mx
どうでもいいけど、次スレから
「Perl・CGIコーディング初心者質問スレ」
に変えるべきだと思う。
0883nobodyさん2006/07/23(日) 01:46:04ID:BeERA3x6
>>872
念のため言っておくけどハッシュにすると遅いよ。
可読性があがるからコーディングが早いってだけ

でもハッシュ使っとけ
0884nobodyさん2006/07/23(日) 02:08:35ID:???
>>882
"CGI コーディング" ってなんだ?
0885nobodyさん2006/07/23(日) 02:19:16ID:???
>>872
速さを求めたいならはじめに両方の要素をソートしておくことをお勧めする。
もちろんそれに応じたコーディングも必要だが要素数が多ければ目に見える効果があるはず。
0886nobodyさん2006/07/23(日) 03:06:54ID:???
拾ってきたコードに
if ($ENV{'PERLXS'} eq "PerlIS") {
print "HTTP/1.0 302 Temporary Redirection\n";
print "Content-type:text/html\n";
}
という記述があったんですが意味がよく分かりません。
分かる人、翻訳お願いできませんか?
0887nobodyさん2006/07/23(日) 03:31:22ID:???
>>886
検索したらすぐに解ったが…
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#My_CGI_scripts_don_t_seem_to_run
ttp://www.att.or.jp/perl/faq/perlwin32faq/perlwin32faq7j.html#How_does_my_script_know_if_it_s_

「ISAPIで実行されていたらステータス行とContent-Typeヘッダ吐き出せ」
08888862006/07/23(日) 03:35:53ID:???
>>887
すみません。まさか検索で引っかかるとは思いが至らず・・・。
要は削除してしまっても問題ない箇所なんですね。
こんな時間にありがとうございました。
0889nobodyさん2006/07/23(日) 03:44:25ID:671DuE1H
>>874
うざいよ、藻前。
>my $foo = "hoge";
>print "$foo";
>みたいに文字列を無駄なダブルクォートで囲う人が居なくなって欲しい。
上のは必要。下のは"$foo\n"が普通なので必要。ちなみに$foo,"\n"より速い。
0890nobodyさん2006/07/23(日) 11:48:54ID:???
>>889
>上のは必要
お前、何当たり前の事言ってんだ…。

>下のは"$foo¥n"が普通なので必要
コード違うじゃん。誰が改行付ける時の話してる?
0891nobodyさん2006/07/23(日) 11:56:10ID:???
ここは初心者質問スレ
0892nobodyさん2006/07/23(日) 12:16:20ID:rog/ar/G
誰か教えてください。
perl-5.8.8で、URLエンコーディングのデコードをやりたいと思っています。
以下の様にやってみました。

 use encoding "euc-jp";
 $str = "%C6%FC%CB%DC";
 $str =~ tr/+/ /;
 $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
 print $str;

が、何も出力されません。

use encoding "euc-jp" を除くと正しく出力("日本")されるのですが、
この部分は入出力の関係上できればのこしておきたいと思っています。

どうしたら解決できるか、どなたかお分かりの方教えてください。
0893速さ順2006/07/23(日) 13:08:12ID:???
$foo."\n"
"$foo\n"
$foo,"\n"

こんな感じか?それなら文字列連結でいいんじゃね
0894nobodyさん2006/07/23(日) 13:30:13ID:???
>>892
これじゃだめなの?
use encoding "euc-jp";
{
  no encoding;
  $str = "%C6%FC%CB%DC";
  $str =~ tr/+/ /;
  $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
}
print $str;
0895nobodyさん2006/07/23(日) 14:44:30ID:???
>>890
なんかこないだから一人ずれてるのいるよね・・・。

>>892 がなんで use encoding 下でダメなのか説明おねがいえらいひと。
0896ヽ(´ー`)ノ ◆.ogCuANUcE 2006/07/23(日) 17:23:10ID:???
>>892
解決法は >>894、もしくは use encoding を使わない。

理由は perldoc encoding の DO NOT MIX MULTIPLE ENCODINGS のあたりを参照。

use encoding "euc-jp";

my $str = '%C6%FC%CB%DC';

print "before: $str (" . length($str) . ")\n";

$str .= "\xFE";

print "after : $str (" . length($str) . ")\n";

use encoding については、作った本人が「使うな」と言ってる上に、
副作用が多すぎる。
新規で書くコードに関しては、Encode.pm で適宜変換するようにして、
文字リテラルには ascii しか書かないか、use utf8 をして utf-8 に
統一してしまうかの、どちらかを選択するべき。
古いコードで use encoding しているものは、no encoding で逃げるか、
駄目なら書き直すべし。

知ってる人間が use encoding 使ってたら、確実に殴る。
■ このスレッドは過去ログ倉庫に格納されています