[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 08/25 20:07 / Filesize : 271 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

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



1 名前:nobodyさん mailto:sage [2007/09/16(日) 19:49:43 ID:???]
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/

649 名前:nobodyさん mailto:sage [2007/12/16(日) 11:33:56 ID:???]
>>646
リモートホストに変換して判断してる。

650 名前:nobodyさん mailto:sage [2007/12/16(日) 16:00:14 ID:???]
>>649
ホストに変換するのは失敗することあるらしいぞ。
直接IPから判断した方が確実。

気にするほどじゃないとは思うけど、どうなんだろ

651 名前:nobodyさん mailto:sage [2007/12/16(日) 18:41:45 ID:???]
perlで2ちゃんねるの専用ブラウザみたいなのって作れるんでしょうか。


652 名前:nobodyさん mailto:sage [2007/12/16(日) 19:23:33 ID:???]
ネットワークをサポートしていて、文章の出力が出来るなら大抵の言語で可能だと思うよ。

653 名前:642 [2007/12/17(月) 11:34:49 ID:FgX+pG+l]
>>644
37行目は一番最後のprintの部分です。

654 名前:nobodyさん mailto:sage [2007/12/18(火) 10:34:57 ID:???]
たとえば、sample.plに、

require('lib/lib.pl');
&dosomething();

と書いておいて、lib/lib.plに、

sub dosomething{
  open(FH, '>> baka.log');
  print FH time."\n";
  close(FH);
}

とすると、lib/の中にファイルができるのではなく、ひとつ上にできてしまいます。
これをlib/の中に保存したいのですが、ライブラリからの相対パスで保存する方法はないでしょうか。
または絶対パスを使うしかないのでしょうか。
ヒントだけでもお願いします。

655 名前:nobodyさん mailto:sage [2007/12/18(火) 11:18:35 ID:???]
>>654
じゃあ、ヒントだけ…
つ %INC

656 名前:654 mailto:sage [2007/12/18(火) 16:52:48 ID:???]
>>655
ありがとう!
こーゆー用途に使うのな。

657 名前:nobodyさん mailto:sage [2007/12/19(水) 01:05:36 ID:???]
ハッシュ配列の各要素をリファレンスとして関数の引数に渡したいのですが
よくわからなくて試行錯誤の末下のような方法にたどり着きました

$AA{'name'} = '1234';
$BB[0]{'name'} = 'abc';
$BB[1]{'name'} = 'ああああ';
$BB[2]{'name'} = '!?';

kansuu( \%AA );
$tmp = \@BB;
kansuu( ${\$tmp->[0]} );
kansuu( ${\$tmp->[1]} );
kansuu( ${\$tmp->[2]} );

sub kansuu
{
  my $h = $_[0];
  print "$h->{'name'}<br>";
}

BBの要素を kansuu() に入れるために
もっとスマートな方法(っていうか正しい書式)がありましたら教えていただけないでしょうか?



658 名前:nobodyさん mailto:sage [2007/12/19(水) 01:14:31 ID:???]
my %AA = ( name => 1234 );
my @BB = (
{name => 'abc'}, #$BB[0]に無名ハッシュ(リファレンス)をいれる
{name => 'ああああ'}, #$BB[1]に〃
{name => '!?'} #$BB[2]に〃
);
kansuu( \%AA ); #\をつけることで%AAのリファレンスがわたる
kansuu( $bb[0] ); #$bb[0]の無名ハッシュリファレンスを渡す
kansuu( $bb[1] );
kansuu( $bb[2] );

sub kansuu {
printf('%s<br>',shift->{name});#ハッシュリファレンスは->をつけて要素を取り出す
}


659 名前:nobodyさん mailto:sage [2007/12/19(水) 02:00:39 ID:???]
$,@,%,\と(),{},[]と->の組み合わせで大抵何とかなる。
正直スカラーのリファレンスの説明は自身がないけどおよそあってると思う
my $scalar = 'abc'; #スカラー
my $scalar_ref = \$scalar; #スカラーのリファレンス
my $anon_scalar_ref = \do {my $anon;}; #微妙に無名じゃないけど
my @array = (1,2,3); #配列
my $array_ref = \@array; #配列のリファレンス
my $anon_array_ref = [1,2,3]; #無名配列のリファレンス
my %hash = (a=>1,b=>2,c=>3); #ハッシュ
my $hash_ref = \%hash; #ハッシュのリファレンス
my $anon_hash_ref = {a=>1,b=>2,c=>3}; #無名ハッシュのリファレンス
my $slacar_object = bless $scalar_ref => __PACKAGE__; # スカラー使ったオブジェクト
my $array_object = bless $array_ref => __PACKAGE__; # 配列使ったオブジェクト
my $hash_object = bless $hash_ref => __PACKAGE__; # ハッシュ使ったオブジェクト
#素直に取り出せる
printf "scalar=%s\n",$scalar;
printf "array=%s\n",$array[0];
printf "scalar=%s\n",$hash{a};
#アドレスっぽいのがとれる
printf "scalar_ref=%s\n",$scalar_ref;
printf "array_ref=%s\n",$array_ref;
printf "scalar_ref=%s\n",$hash_ref;
#リファレンス先の値書き換えたり取り出したり
$$scalar_ref = '書き換えちゃった';printf "scalar=%s\n",$$scalar_ref;
$array_ref->[1] = '書き換えちゃった';printf "array=%s\n",$array_ref->[1];
$hash_ref->{b} = '書き換えちゃった';printf "scalar=%s\n",$hash_ref->{b};
#デリファレンスする(copyが作られる)
my $scalar2 = ${$scalar_ref};
my @array2 = @{$array_ref};
my %hash2 = %{$hash_ref};


660 名前:nobodyさん mailto:sage [2007/12/19(水) 07:53:49 ID:???]
CGI.pmでmetaを出力したいのですがうまくいきません。
↓これを出力したいのですが・・・
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

ttp://www.geocities.co.jp/SiliconValley-Sunnyvale/6128/perl/cgipm.html

このページの解説によると、

use CGI;
my $q = CGI->new;

print $q->start_html(
              -head=>meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

このようなコードになるはずなのですが、やってみると
Undefined subroutine &main::meta called
というエラーがでます。meta()がメインのサブルーチンだと解釈されてるみたいです。



661 名前:660 続き mailto:sage [2007/12/19(水) 07:54:19 ID:???]
print $q->start_html(
              -head=>$q->meta({'http-equiv' => 'Content-Type'
              -content=>"text/html; charset=$CharSet"}
),

とやると一応うまくいくのですが、なぜか
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />


このようにもう一つ余計なメタが出てしまいます。どうすればいいのでしょうか?
CGI.pmは3..31です。


662 名前:nobodyさん mailto:sage [2007/12/19(水) 10:23:45 ID:???]
>>660-661
perldoc.jp/docs/modules/CGI.pm-2.89/CGI.pod

my $q = CGI->new;
$q->charset('UTF-8');

663 名前:660 mailto:sage [2007/12/19(水) 23:37:11 ID:???]
>>662

ありがとうございました!

664 名前:657 mailto:sage [2007/12/20(木) 08:31:41 ID:???]
>>658-659
ありがとうございます!
超わかりやすくて助かりました
今のプログラムの色んなところがもっと簡潔に書けそうです

665 名前:nobodyさん mailto:sage [2007/12/20(木) 10:28:40 ID:???]
> 超わかりやすくて助かりました
> 今のプログラムの色んなところがもっと簡潔に書けそうです

本当はわかってないくせに。

666 名前:nobodyさん mailto:sage [2007/12/20(木) 13:33:18 ID:???]
>>658-659ですべてが理解できれば天才

667 名前:nobodyさん mailto:sage [2007/12/20(木) 13:39:25 ID:???]
最低限は書かれてて分かりやすいとは思ったぞ




668 名前:nobodyさん mailto:sage [2007/12/20(木) 16:21:00 ID:???]
読む気もしねぇよ

669 名前:nobodyさん mailto:sage [2007/12/21(金) 21:13:42 ID:???]
でもああやって思いつく限りの書き方試して要素やハッシュ値見てればなんとなくでもわかってくるはず。
めんどいけど。

670 名前:nobodyさん mailto:sage [2007/12/22(土) 18:50:11 ID:???]
あんな変な列挙を眺めるんじゃなくて、続初めてのPerl読むべきだろ。

671 名前:nobodyさん mailto:sage [2008/01/02(水) 06:47:19 ID:???]
perl5.10 に移行した人います?

672 名前:nobodyさん mailto:sage [2008/01/02(水) 20:07:21 ID:???]

依存コードは書いてないけど

673 名前:nobodyさん mailto:sage [2008/01/03(木) 00:16:04 ID:???]
ノシ
cygwinで5.10入れてみた
use 5.10;で書いてみてる

674 名前:nobodyさん mailto:sage [2008/01/05(土) 22:21:41 ID:???]
変数の中身を展開せずに確認したい場合ってどうすればいいんでしょうか?

$test = "今日は\n いい天気です $wether";

こんな変数があるとして、$test自体は展開してほしいんですが、
中身の\nや$wetherは展開せずに出力したいのです。

675 名前:nobodyさん mailto:sage [2008/01/05(土) 22:58:36 ID:???]
'

ちなみに、weather?

676 名前:nobodyさん mailto:sage [2008/01/06(日) 03:58:05 ID:???]
>>674
$testに代入した時点で展開しちゃってるでそ
そもそも確認したい意図は何?

リファレンスにしてアドレスを確認する手もあるけど

677 名前:674 mailto:sage [2008/01/06(日) 14:08:20 ID:???]
うーん、無理みたいですね。諦めます。一応問題は解決しましたので

>>675
そうです;
>>676
なるほど・・・
意図は正規表現でゴチャゴチャいじったあとの文字列が
どうしてもめちゃくちゃくになってしまうので、変数の位置関係を調べたかったのです。



678 名前:nobodyさん mailto:sage [2008/01/06(日) 16:36:10 ID:???]
>>674はなぜ>>675の一行目を無視するんだ?
それが答えじゃないか。
>>676はそれもわかってないみたいだが。

679 名前:nobodyさん [2008/01/06(日) 23:12:25 ID:wcb81UNa]
$kekka = int(200 * 0.29);
print "$kekka";

このような計算をしたら、結果が57になりました。
intって小数点が発生した時に切り落とすはずですよね?
えと、なぜこんなことになるのか意味が分からないのですが、
誰かご教授お願いします

680 名前:nobodyさん mailto:sage [2008/01/07(月) 01:59:09 ID:???]
>>679
www.tt.rim.or.jp/~rudyard/torii009.html

681 名前:nobodyさん mailto:sage [2008/01/07(月) 11:17:24 ID:???]
それ、今じゃ間違いじゃないってのが一般的。
語源の知識としてはありだけど、誤用が定着するなんていくらでもあることだから。

いつもいつも空気読めない人が指摘するよな。

682 名前:nobodyさん mailto:sage [2008/01/07(月) 11:27:36 ID:???]
>>679
$kekka = int(((my $n=200 * 0.29)=~/(.*)/)[0]);
print "$kekka";

こう書けばOK

683 名前:nobodyさん mailto:sage [2008/01/07(月) 11:29:04 ID:???]
>>681
誤用でない方が一般的だとする根拠は?

684 名前:nobodyさん mailto:sage [2008/01/07(月) 11:38:36 ID:???]
回答にはなってないけれど、こちらの環境でもいくつか試してみた
ので、その結果を書いておく。
何でこんな風な結果になるのだろうか。私も分からなかった。

$kekka = 200 * 0.29;
print "$kekka";
出力:58

$kekka = 200 * 0.29;
$kekka = int($kekka);
print "$kekka";
出力:57

$kekka = int(200 * 0.29);
print "$kekka";
出力:57

$kekka = int(2 * 29);
print "$kekka";
出力:58

685 名前:nobodyさん mailto:sage [2008/01/07(月) 12:30:31 ID:???]
浮動少数の扱いの問題。
use bignum; これで解決。

686 名前:nobodyさん [2008/01/07(月) 21:15:48 ID:XSyaqzwg]
>>685
おぉ いきました!
詳しい原因はよくわからないですが、ありがとうございました。

687 名前:nobodyさん mailto:sage [2008/01/07(月) 21:22:49 ID:???]
ためしにPerlじゃなくてLispで
(* 200 0.29)
ってしてみたら57.99999999999999だってさ。機械の計算って難しいことがあるな




688 名前:nobodyさん mailto:sage [2008/01/07(月) 22:41:02 ID:???]
誤差については、がっこで習うものだと思ってたけど、そうでもない?


689 名前:nobodyさん mailto:sage [2008/01/07(月) 22:44:33 ID:???]
俺は習ったけど、もしかしたら教えてないところも少なくないかもしれん

690 名前:nobodyさん mailto:sage [2008/01/07(月) 23:59:36 ID:???]
情報工学を扱う授業でもなきゃ教わらないんじゃね?
少なくとも俺は浮動小数点の丸め誤差については習ったことない。

あと高校の世界史も。

691 名前:nobodyさん mailto:sage [2008/01/08(火) 00:07:25 ID:???]
>>683
>>681じゃないがなんかの辞書に載ってた気がする
ソースはない


692 名前:nobodyさん [2008/01/08(火) 00:31:05 ID:k+nta2fc]
丸め誤差の知識はありますけど、
コンピュータの中で200*0.29ってどうやって計算してるか分からない
そもそも結果が57.9999・・・・になると言われても、どういう計算をしているのか
さっぱりw

693 名前:nobodyさん mailto:sage [2008/01/08(火) 00:34:28 ID:???]
しかも
(* 20 0.29)
これは5.8って表示されるから困るw

694 名前:nobodyさん mailto:sage [2008/01/08(火) 00:38:53 ID:???]
自前のショッピングカートの消費税を int($sum * 0.05) みたいに計算してるんだけど、大丈夫だろうか…

695 名前:nobodyさん mailto:sage [2008/01/08(火) 07:14:24 ID:???]
>>694
>>685にすれば大丈夫かと

696 名前:nobodyさん mailto:sage [2008/01/08(火) 08:15:35 ID:???]
俺は一番最初の質問者ではないが、浮動小数点の丸め誤差については、
wikipediaにも載ってたね。
問題の解決には、 use bignum; つかえばいいわけで、それでいい
のは分かるけれど、それとは別の話で、小数を100倍して整数で演算をして、
あとで100で割ったりする方法だったらちゃんとでるから
use bignum; しなくてもいいんだよね?

697 名前:nobodyさん mailto:sage [2008/01/08(火) 22:01:08 ID:???]
>>696
0.29が有効数字2桁だとあらかじめ分かっているなら100倍すればいいけどなあ。
既知でないときにはuse bignum;じゃないか?



698 名前:nobodyさん mailto:sage [2008/01/09(水) 00:10:32 ID:???]
>>697
レスサンクス。
いや、意味の無い部分の考えかなと思ったんだけど、
そっちの方がメモリが少なくて済み、処理が早くなったりするのかなとか
思ったのよね。ま、すごく小さな世界をいっているんだろうけれど。

699 名前:nobodyさん mailto:sage [2008/01/09(水) 01:01:57 ID:???]
うーん、俺も難しいことはわからんけど、
俺は細かい実行時間を気にしてミスをするより、コードの可読性を優先したいな。と思った。
大量のデータを扱う人から見ればふざけた態度かもしれないけどね。

700 名前:nobodyさん mailto:sage [2008/01/09(水) 02:01:45 ID:???]
LL的には人間にとっての最適化(コードの可読性)のほうが重要だからそれでいいと思うな

701 名前:nobodyさん [2008/01/09(水) 03:08:01 ID:480klIK2]
リーダビリティ重要。(高橋メソッド風に)

702 名前:nobodyさん mailto:sage [2008/01/10(木) 23:51:33 ID:???]
IPを10進数に変換したものと、
サブネットマスク形式のリストをマッチングさせたいんですが、
どんなループさせればいいですかね?

#判定ルーチン内
foreach (@list) {
 my ($min,$max) = subnetMinMax($_);
 return ($ip >= $min and $ip <= $max) ? 1 : 0;
}
としてるんですが、grep等を使ったほうが良いんでしょうか?
ループ内でサブルーチン呼ぶのがちょっと気になります。

703 名前:nobodyさん mailto:sage [2008/01/11(金) 00:04:09 ID:???]
訂正orz

x: return ($ip >= $min and $ip <= $max) ? 1 : 0;
o: return 1 if($ip >= $min and $ip <= $max);

704 名前:nobodyさん mailto:sage [2008/01/11(金) 11:44:26 ID:???]
@listの中にマッチするものが複数存在する可能性があって
何にマッチしたか全て取りたいならgrepだけど
有るか無いかだけでいいならループ回して見つけ次第結果返していいんじゃない?


705 名前:nobodyさん mailto:sage [2008/01/11(金) 16:30:20 ID:???]
return $ip >= $min and $ip <= $max;


706 名前:nobodyさん mailto:sage [2008/01/11(金) 20:31:41 ID:???]
>>704
なるほど。このままにしますありがとうございました。

>>705
そっか、そうですよね。
聞いてみて良かったです。

707 名前:nobodyさん mailto:sage [2008/01/12(土) 13:10:11 ID:???]
「うんこ」を含む行の最後に「出る」と追加することってできますか?
「うんこ」の前後は英数字・日本語交じりで文字数は不定です。
$_ =~ s/(うんこ)/$1でる/;
だと、うんこ〜出るの間の文字が文末にきてしまいます。
文末指定は$みたいなので
$_ =~ s/(うんこ)/$1でる$/;
としてperlを実行させると、エラーなのか、プログラムが終わりません。



708 名前:nobodyさん mailto:sage [2008/01/12(土) 13:13:01 ID:???]
if ( $うんこ =~ /うんこ/ ) {
 $うんこ .= ’でる’


709 名前:nobodyさん mailto:sage [2008/01/12(土) 13:38:43 ID:???]
「うんこを含む行」「改行」 ⇒ 「うんこを含む行」「でる」「改行」

if (index($_, 'うんこ') >= 0){ $_=~ s/$/でる/; }

710 名前:707 mailto:sage [2008/01/12(土) 13:54:47 ID:???]
>>708
全角を半角にしてやってみたりしましたが、エラーでした。

>>709
できました。ありがとうございます。
ただ、>=0の意味が分かりません。
改行は\nじゃないんですか?

711 名前:nobodyさん mailto:sage [2008/01/12(土) 18:35:26 ID:???]
なにこのうんこスレ

712 名前:nobodyさん mailto:sage [2008/01/12(土) 19:18:44 ID:???]
>>710
index

713 名前:707 mailto:sage [2008/01/12(土) 22:50:20 ID:???]
>>712
すみません、わかりました。ありがとうございました。

714 名前:nobodyさん [2008/01/13(日) 13:16:41 ID:rzzkvCmj]
怠惰が美徳だの
エロエロ言語だの
言うけどさ
俺が習ってきた主な4つの言語のなかじゃ
間違いなく一番習得が苦しかった

つまり、学習コストは高い
Perlより習得が難しい言語ってあるの?

私見では達人レベルを目指すならC++が全言語のなかで一番習得困難
そこそこのプロレベルを目指すならPerlが一番困難(C++はそこそこのプロならまだ簡単)

715 名前:nobodyさん [2008/01/13(日) 13:17:19 ID:rzzkvCmj]
スレ間違えた( ゚д゚ )

716 名前:nobodyさん mailto:sage [2008/01/13(日) 21:52:12 ID:???]
配布用のスクリプトを書く予定なんですが、
変数名のつけ方で悩んでいます。
たとえば、
my $title;
my $script_content_title;
my $ScriptContentTitle;
sub param{}
sub parse_URL_encoded_string{}
sub ParseURLEncodedString{}
等、色々書き方ありますが
短い方が良いのか、わかりやすい名前が良いのか、
又、大文字、小文字を混ぜて使うべきか、覚えやすい名前にするべきか、
意見ください。
賛否両論あると思いますが、極力万人受けするものを選びたいです。

長文すみません

717 名前:nobodyさん mailto:sage [2008/01/13(日) 21:53:50 ID:???]
配布スクリプトの中身の変数名なんて誰も見ねぇよ



718 名前:nobodyさん mailto:sage [2008/01/13(日) 21:56:06 ID:???]
>>717
学習、改造用として配布したいんです。

719 名前:nobodyさん mailto:sage [2008/01/13(日) 22:43:42 ID:???]
perldoc perlstyle

720 名前:nobodyさん mailto:sage [2008/01/13(日) 23:03:26 ID:???]
変数や関数の名前の付け方は、どんなプログラムを書こうとしている
かというところもあるからな。
例えば、関数名で html_ をつけるとそうでないものとの区別がついて
分かりやすくなるけれど、全部の関数に html_ がついてたら
逆に無意味に長いだけとなる。
ここでアドバイスが欲しかったら、その書こうとしているプログラムや
ソースをもう少し具体的にだすとかしないと話は進まないと思う。

721 名前:716 mailto:sage [2008/01/13(日) 23:22:17 ID:???]
>>719
ありがとうございます。全部読みました。

基本的にはアンダースコアを使うべきだそうです。
スコープによって使い分けるのが良いみたいですね。
$Global_Data #グローバル
$tmp    #局所
$LOCK_KIND #定数

>>720
プログラムの種類によって書き方が変わる、変えられるのがperlの利点かもしれませんね。
>全部の関数にhtml_
そういうのはパッケージにまとめればOKですかね。

おかげ様で書き方が頭に浮かんできました。ありがとうございました。

722 名前:nobodyさん mailto:sage [2008/01/14(月) 02:09:11 ID:???]
Perlプログラマは"不精"なので面倒なタイピングはしません。
でもPerlプログラマは"傲慢"なので他人のコーディングスタイルを気にしません。
こんなイメージ。

723 名前:nobodyさん mailto:あげ [2008/01/14(月) 02:26:48 ID:???]
怠惰と傲慢と短気だっけなラリーの三原則。

ネーミング重要。(高橋メソッド風に)

でも職人芸的なところあるよねネーミングセンスって。
なかなかそこは難しい。

724 名前:nobodyさん mailto:sage [2008/01/14(月) 04:10:53 ID:???]
果たして自閉症の描くイメージとは

725 名前:nobodyさん mailto:sage [2008/01/14(月) 04:15:16 ID:???]
>>716
もう解決したみたいだけど、Perlベストプラクティスもおすすめ
ダミアン先生の盲信はいけないけど、かなりためになるYo

726 名前:nobodyさん mailto:sage [2008/01/14(月) 17:41:01 ID:???]
ダミアン先生はPerl界屈指のハッカーだが、著作物での記述にクセが全くないわけではないからね。

一般論としては、上を目指すならいろんなハッカーのコードや文章にたくさん触れることが必要。
これがなかなか大変だし難しい。
そのためにはネット上のコミュニティーやリアルのイベントにこまめに参加したり
ブログを定期的にチェックし続けないといけないから。
そういうことをしてない自称Perl使いが結構俺の周りにはいて、
そういう奴らは我流のあまりエレガントじゃないスタイルから抜け出せないでいる。

727 名前:nobodyさん [2008/01/14(月) 18:57:12 ID:4AKnbZN2]
ファイルに入っている文字を出力するつもりなのですが、
メタ字が混ざっていることもあり、ちゃんと出力できません。
あらかじめファイルの中のメタ字に\を振って置くとしても、かなりの手間になりそうですし、
何か効率の良いメタ字対策はないでしょうか?



728 名前:727 [2008/01/14(月) 19:02:23 ID:4AKnbZN2]
すみません。微妙に文書が狂っていました。
ファイルに入っている文字からの出力の際の
文字化けする文字の対策をお願いします。

729 名前:716 mailto:sage [2008/01/14(月) 20:00:43 ID:???]
>>725-726
オライリーファンの俺には最高の本かもです。
>>727-728
余計な事してるからじゃないですかね?
quotemetaなんてのはどうですか?
文字コードなんかも書くと返事もらえるかも。






730 名前:nobodyさん mailto:sage [2008/01/14(月) 20:08:53 ID:???]
>>727
情報不足です。
「ファイルに入っている文字」…どんな文字? 文字コードは何?
「出力するつもり」…どこに出力するの?
「メタ字」…具体的にどの文字ですか?
「ちゃんと出力できません」…具体的にどのように出力できないのですか?

ありがちなのは、ファイルの中と、コンソールの文字コードの設定が異なっていて、文字化けしたように見えるとか。
メタ文字をいったん解釈してしまっているとか。
ヌル文字とかタブとか垂直タブとかグループセパレータとかasciiの制御コードはそもそも「文字」ではないですし。
「文字」をどう「出力」したいのかにもよります。

コードを示してはどうですか。

731 名前:727 [2008/01/14(月) 20:18:57 ID:4AKnbZN2]
$i = 0;
while($list = <IN>){
 (undef,$name[$i],undef) = split(/:/, $list);
 $i++;
}
@name = sort(@name);
while($line = <@name>){
 print "<option value='$line'>$line</option>";
}
えーっと、コードはこのような感じです。
ファイルのDBにアクセスして、その中の一部を取り出しソートしてhtmlで出力するという形です。


732 名前:nobodyさん mailto:sage [2008/01/14(月) 20:21:10 ID:???]
メタ文字がhtmlの解釈の問題を引き起こしてるんじゃないよね?

733 名前:nobodyさん mailto:sage [2008/01/14(月) 20:23:30 ID:???]
metaタグで宣言している文字コードと異なるとか…
html中で使われてる文字コードと出力してる変数の文字コードの不一致とか…

734 名前:727 mailto:sage [2008/01/14(月) 20:30:22 ID:???]
>>733
タグで宣言しているコードは関係ないのではと思います。
出力するとき、一部の文字がうまく表示出来ていませんから。


735 名前:727 mailto:sage [2008/01/14(月) 20:32:56 ID:???]
現状としてはファイルの中の「ソ」とかに\を付けていけば表示はうまくいくのですが、
ファイルをその後書き換えたりするとそれも出来なくなるのではないかと思っております。

736 名前:nobodyさん mailto:sage [2008/01/14(月) 20:40:00 ID:???]
これか?www.kentweb.jp/pubc/jcode/

737 名前:nobodyさん mailto:sage [2008/01/14(月) 20:46:05 ID:???]
>>735
use utf8;
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ':encoding(shiftjis)';
# windowsなら shiftjis -> cp932

↑やってみて
ソース中に日本語文字列書くならutf8で保存してね。




738 名前:nobodyさん mailto:sage [2008/01/14(月) 20:54:55 ID:???]
あw
binmode IN, ':encoding(shiftjis)';
かな?

739 名前:nobodyさん mailto:sage [2008/01/14(月) 20:57:33 ID:???]
>>731
DBにアクセスしているのにファイルハンドルから@nameに格納しているとはいかに?
@nameへの格納の仕方が心許ないです。せめて以下のようにするとか。
my @name = map { (split(/:/))[1] } <IN>;
splitの対象が全角のコロンですが、perlソースと取り扱うデータの文字コードが合っていないと
間違いの元ですよ。

で、optionタグで書き出すべき文字列のリストが@nameに入っていて、それをどうしてグロブ
演算子を使っているのかわかりません。私はこんなこと一度もしたことありませんが…。
ここで、@nameの各要素がいったん解釈されてしまっていて、カタカナのソなどSJISの2バイト目の
\x5cが取り除かれてしまっています。単に
for (sort @name) {
  print qq{<option value="$_">$_</option>\n};
}
でいいと思うのですが。

740 名前:nobodyさん mailto:sage [2008/01/16(水) 00:34:21 ID:???]
CGI::Applicationで index.cgi?rm=<デタラメなキー> のように
run_modesで定義されなかったrun_modeを指定するとエラーが発生させられてしまうのですが
未定義の場合デフォルトのrunmodeを起動させる方法は無いでしょうか?

741 名前:nobodyさん mailto:sage [2008/01/16(水) 02:08:57 ID:???]
$self->run_modes(
    AUTOLOAD => \&catch_my_exception,
);

742 名前:nobodyさん mailto:sage [2008/01/16(水) 02:17:14 ID:???]
>>741
ありがとうございます!試してみます。

743 名前:nobodyさん [2008/01/16(水) 04:59:20 ID:FWbaTTLj]
5.005です。
以下のような、引数が省略可能なサブルーチンがあるとします。

 sub Func(;$\@\%) { (省略) }

このとき、引数が渡されたのか、それとも省略されたのかを
Func内で判断する方法を教えてください。

なお、そのままifに入れると偽となるような値(例えばスカラーの値が0)の場合も、
引数が渡されていると判断します。

744 名前:nobodyさん mailto:sage [2008/01/16(水) 05:29:59 ID:???]
>>743
引数の数から判定
sub Func(;$\@\%) { print scalar @_ }
Func(); # 0
Func(undef); # 1
Func(1, @hoge); # 2

745 名前:nobodyさん mailto:sage [2008/01/16(水) 05:44:10 ID:???]
>744
ありがとうございます。
なるほど、サブルーチンを使う時は常に@_を意識しないとダメだってことですね。

746 名前:nobodyさん mailto:sage [2008/01/16(水) 11:29:46 ID:???]
@_ ってカタツムリみたいだよね。

@_ii

747 名前:nobodyさん [2008/01/16(水) 14:19:16 ID:Z4nycbhz]
かたつむり大作戦



748 名前:nobodyさん [2008/01/16(水) 20:06:54 ID:L/Qn1HzA]
質問です!

入門書を見ながら「URLにパラメータを加える」というのをやりました。

〜〜/test.cgi?list=man

とURLにパラメーターをくっつけ、cgiで

&ReadParse( *form );
$sex = $form{ 'list' };

と受け取ったつもりだったのですが、結果をprintしてみると

manman

と2回表示されてしまいます。これは何が悪いのでしょうか?

749 名前:nobodyさん mailto:sage [2008/01/16(水) 20:30:55 ID:???]
いるんだよ、自分で勝手に照会用のコードを切り詰める奴






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<271KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef