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

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

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

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

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

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

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

前スレ http://pc8.2ch.net/test/read.cgi/php/1153987463/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0483nobodyさん2006/12/24(日) 22:15:47ID:???
乗り遅れたが後悔はしない
0484nobodyさん2006/12/24(日) 22:28:56ID:???
俺も乗り遅れたが後悔はしていない
ただ1つ書くなら・・・俺はこの板でスキルアップさせてもらってる
04853732006/12/24(日) 23:22:02ID:???
>>374 遅くレスすいません以下のようにしたんですが

if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
chomp;
if ($name eq $_){ $name = "禁止";}
}
close(WORD);

これであってますか・・? と、いうか禁止ワードに反応なしなので
未だにできてません(´Д⊂)
0486nobodyさん2006/12/24(日) 23:40:55ID:5VuL7TZS
>>485
$name に何が入ってるのかわからんけどさ
$name =~ /$_/ig;
にしたら?
iオプションは必要だけどgオプションが必要かどうかは自分で決めてね
0487nobodyさん2006/12/24(日) 23:44:25ID:5VuL7TZS
それでも引っかからなければ文字コード
両方コード揃えてひっかければいい
これでダメなら他が悪い

use Jcode;
$name = jcode->($name)->euc;

if (!open(WORD,"bad.txt")) { &error('データベース読取エラー'); }
foreach(<WORD>){
chomp;
$temp = jcode->($_)->euc;
if ($name eq $temp){ $name = "禁止";}
}
close(WORD);
0488nobodyさん2006/12/25(月) 02:20:59ID:WCngGP1U
$fooにfooという文字列、$hogeにhogeという文字列が入っているとして、
$barにはfooを含む文字列が入っているとすると、

$bar =~ s/$foo/$hoge/;

としても置き換えはされないのですが、

$bar =~ s/foo/$hoge/;

としたら置き換えがされるのは何故でしょうか?
$fooが評価されていないということは分かったのですが、何故かが分かりません。
0489nobodyさん2006/12/25(月) 02:30:55ID:???
>>488
ん?

my $bar = 'foo!foo!foo!'; my $baz = $bar;
my $foo = 'foo'; my $hoge = 'hoge';

$bar =~ s/$foo/$hoge/g;
$baz =~ s/foo/$hoge/g;
print $bar, "\n", $baz;
--
hoge!hoge!hoge!
hoge!hoge!hoge!
0490nobodyさん2006/12/25(月) 02:35:21ID:WCngGP1U
>>489
なに・・・!
なぜでしょう・・・(´・ω・`)

実際のプログラム中ではオブジェクトとして扱っているのは関係あるのでしょうか?
($fooは実際は$self->{foo}->{bar}としている)

$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;
0491JAPU ◆lVJAPUTeX. 2006/12/25(月) 03:01:53ID:???
>>486
g は全く要らない。
i は必要とは言えない。

>>488
実際には foo は日本語で、しかも Shift_JIS 使っているなら、
$bar =~ s/\Q$foo/$hoge/;
としてみては?
0492nobodyさん2006/12/25(月) 03:09:41ID:WCngGP1U
>>491
日本語じゃなく、文字コードを指定していなかったんですけど、\Qを挿入したら出来ました・・・

\Q : \E までのパターン指定メタ文字の意味を打ち消す

(´・ω・`)ナゼ?
0493nobodyさん2006/12/25(月) 03:16:49ID:WCngGP1U
$bar =~ s/$self->{foo}->{bar}/$self->{foo}->{hoge}/;において、$self->{foo}->{bar}にパターン指定メタ文字が含まれていたのでしょうか・・・

あ、ご解答下さったみなさん、ありがとうございました!
0494nobodyさん2006/12/25(月) 05:19:01ID:???
s///e;
0495nobodyさん2006/12/25(月) 06:46:37ID:85L6NXNb
>>491

>g は全く要らない。
>i は必要とは言えない。
gは全くいらなかったね置換するわけじゃないしね
iは日本語と決まってるならいらないだろうけどsexとかだったらいるんじゃねえ?
0496nobodyさん2006/12/25(月) 07:23:16ID:???
sex!sex!sex!
0497nobodyさん2006/12/25(月) 08:45:43ID:???
バカは回答すんなよ
0498nobodyさん2006/12/25(月) 13:28:03ID:bvP5u9Gv
何故か「ー」の置換が出来ません。
他の日本語や、逆(〜をーにする)は出来ます。何故なんでしょうか?

print "content-type: text/html\n\n";

$str = "ボール";
$out = "ー";
$in = "〜";

$str =~ s/$out/$in/;
print $str;
0499nobodyさん2006/12/25(月) 13:52:39ID:ClYkzmks
use Foo;
use ...;
use ...;

と、複数のpmファイルをuseしたのですが、先頭行のuseだけにエラーが出ます。

Can't locate Foo.pm in @INC (@INC ...

ちゃんとFoo.pmは存在するし、他の行のuseにはエラーが出ないのですが・・・
このエラー文は、モジュールがインストールされていないという意味のほかに、なにか意味はあるのですか?
05004992006/12/25(月) 13:58:43ID:ClYkzmks
何度もすみません。

use Foo;
use Hoge;
use ...;
use ...;

だとFoo.pmに関して、

use Hoge;
use Foo;
use ...;
use ...;

だとHoge.pmに関してしてエラーが出ていたようです。
@INCの検索パスにそれらのファイルが含まれていないということでしょうが、ちゃんとそのディレクトリに置いてあるんです\(^o^)/オワタ
0501nobodyさん2006/12/25(月) 14:26:49ID:???
>>498
つEUC
0502nobodyさん2006/12/25(月) 14:29:15ID:???
use lib しなけりゃエラーが出て当然だと思いますが・・・
05034992006/12/25(月) 14:29:36ID:ClYkzmks
>>502
use libは宣言しています。
05044992006/12/25(月) 14:36:15ID:ClYkzmks
問題のファイルは以下のものです。
http://www.uploda.org/uporg630190.zip.html

(pass : 2ch)

use lib qw(./lib);
use Common::Cookie;

として使用しています。
なにかファイルに問題はありますか?
0505nobodyさん2006/12/25(月) 14:48:11ID:???
/lib/Common/Cookie.pm にしてますか?
05064992006/12/25(月) 14:51:36ID:ClYkzmks
>>505
はい、呼び出し側との相対パスは./lib/Common/Cookie.pmです。
0507nobodyさん2006/12/25(月) 15:10:41ID:???
>>498
\Q \E
0508nobodyさん2006/12/25(月) 19:38:47ID:ClYkzmks
\r\n、\r、\nは<BR>に変換するけど、<BR>はどの改行コードに戻せばいいの?
対象のOSによって変わると思うんだけど・・・
0509nobodyさん2006/12/25(月) 19:52:10ID:???
\x0d\x0a|\x0d|\x0a
お好きなのをどうぞ
0510nobodyさん2006/12/25(月) 19:56:04ID:???
その「お好きなの」をどれにするかで迷ってんじゃね?
0511nobodyさん2006/12/25(月) 19:57:38ID:ClYkzmks
はい。
プラットフォームによって改行コードを勝手に決めてくれたりは出来ないんですか?
0512JAPU@坂井恋夏 ◆lVJAPUTeX. 2006/12/25(月) 20:23:02ID:???
>>492
記号類はメタ文字 (特殊文字) になるものがあるので、よく分からなければ \Q$var\E しておくのが良いです。Shift_JISの場合、漢字の一部にメタ文字が含まれる可能性があるので、思わぬところでエラーとなります。

>>495
要件に「大文字小文字を区別するかどうか」が含まれていないため、必要に応じて i 修飾子を付けてください、という意味です。

>>498
文字コードはShift_JISを使っていますね。「ー」の2文字目は「[」であるため、バイト単位で処理する場合にはそれがメタ文字として見なされます。
ですから、以下のような方法で回避する必要があります。

1. >>501 EUC-JPを利用する。
2. >>507 \Q$out\E とする。
3. Jperlを利用する。(今となってはお勧めできない)
4. 入出力をきちんとハンドリングして、内部では常にutf-8フラグつきの文字列として扱う。(多少面倒だが漢字も1文字単位で処理できるのでお勧め。「Perl utf8」でググれば参考サイトは沢山出てきます。)
5. 先頭で use encoding "Shift_JIS"; する。(あまりお勧めできない)
他にあったっけ?

# Shift_JISでは /セーラープルート/ がエラーになるので悲しい。
0513JAPU ◆lVJAPUTeX. 2006/12/25(月) 20:23:36ID:???
>>506
ライブラリの位置を指定する (-Iオプションや use lib) 際、相対パスの基準位置はカレントディレクトリです。また、use でエラーになった場合にはそれ以降の use は実行されずモジュールが存在しない場合でもエラーが出ません。
スクリプトの位置を基準点とした相対ディレクトリで指定したい場合には以下のように FindBin を利用します。

use FindBin;
use lib "$FindBin::Bin/lib";

>>508
Unix: LF (\r\n)
DOS/Windows: CRLF (\r\n)
Mac: 昔はCR (\r) だったけど今どうなの?
意識して変換するのであれば、CRLFにしておくのが無難だとは思う。Perl v5.8では、以下のようにしてPerlIO階層で変換してくれるので便利。(ファイルに出力するのであれば open 時に指定することも可能。)
binmode STDOUT, ":crlf"
0514nobodyさん2006/12/25(月) 22:37:26ID:ClYkzmks
OOPにおいて、メソッドの呼び出しには引数の括弧は省略しない方が良いのですか?
0515nobodyさん2006/12/26(火) 05:42:28ID:???
>>508
\nでOSの改行コードになる。
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify

>>513
\rと\nの解釈が間違ってないか?
05164982006/12/26(火) 08:40:27ID:???
なるほど、ご丁寧に教えてくださってありがとうございます。
0517nobodyさん2006/12/26(火) 16:19:37ID:???
>>508と>>515は同じ事を書いているように見えるのだが
0518nobodyさん2006/12/26(火) 18:42:02ID:???
設定:自動登録型リンク集スクリプト

管理パスを確認
↓
パスがあってたら登録サイト一覧を表示
↓
削除したいサイト選択後に削除←この時の質問なんだけど


削除したいサイト選択後のスクリプトの呼び出し方がわからない

削除したいサイトをチェックボックスで選択後、インプットタグでスクリプトを呼び出して、
サイト削除のサブルーチンを呼び出すって流れなんだけど、

引数やhiddenで呼び出す書き方だと外部からも直接呼び出せてしまうわけで、
管理画面からのみ呼び出せるようにするにはどうしたらいいの?


0519nobodyさん2006/12/26(火) 18:46:11ID:PubWBr4/
cookieに管理権限渡しておいてcookie checkでOKなら削除、NGならエラーってすれば良いと思うよ。

あとスレ違い
0520nobodyさん2006/12/26(火) 18:52:44ID:???
>>518
質問が変に具体的すぎてよくわからんが
Session管理するか、それに近いものを実装する
0521JAPU ◆lVJAPUTeX. 2006/12/26(火) 20:08:35ID:???
>>515
古代のMacPerlではohzakiの記載も正しいですが、最近のPerlでは\n = NL(LF), \r = CR のはずですが…
今時そこまで古いバージョンに気を使う必要は無いでしょう。
そもそも、\n と \r の意味が逆転しているのも独自仕様ですし。

>>518
セッション管理が面倒なら、削除する際にも再度パスワードを入力させてチェック。
この手法だと、CSRFを回避することができるおまけ付き。
0522nobodyさん2006/12/26(火) 20:15:42ID:???
>>521
ん?よく分からないんだが、最新のActivePerlとかMacPerlでは挙動が変わったってこと?
よその環境用には書かないからマジでわからん。
0523nobodyさん2006/12/26(火) 20:17:46ID:???
WinのActivePerlは\n = CRLF
05245182006/12/26(火) 20:43:26ID:ISbRNGDd
>>519-521
ありがとうございました
解決しました
0525JAPU@坂井恋夏 ◆lVJAPUTeX. 2006/12/26(火) 20:51:33ID:???
Perlでは特に指定しない場合はbinmodeではありません。このため、入出力時にはそのOSに応じた改行コードと \n が相互に変換されます。したがって、何もしない場合にはPerl内部で扱う改行コードは常に \n であるわけです。

binmode はこの改行コード変換を抑制する関数です。(最近ではそれに加えてPerlIO層の変換ルールを指定する機能も持たされました。)

この変換があるため、Windows環境ではbinmodeを指定せずバイナリ (画像データなど) を出力する際に正しいデータが出力できないという罠に陥ります

# MacPerl の場合、\r と \n の役割を入れ替えることで、Unix 用に書かれたスクリプトが (binmodeせず) そのまま動作することを期待していたのでしょう。(多分)

ActivePerl でも、\n 自体は LF となります。以下が実行例です。
C:\>perl -e "$x = qq[\n]; print unpack q[H*], $x"
0a

また、binmodeの有無によって改行コードの変換がされる・されないことは以下の通り実行したら分かります。
C:\tmp>perl -e "open FH, q[> sakura.txt] or die; print FH qq[\n]"
C:\tmp>perl -e "open FH, q[> tomoyo.txt] or die; binmode FH; print FH qq[\n]"

MacPerl は今でもあるかは知りません。
「古代のMacPerlでは」→「少なくともある時点でのMacPerlでは」に訂正します。
0526nobodyさん2006/12/26(火) 21:15:11ID:???
( ^ω^)……
0527nobodyさん2006/12/26(火) 21:42:36ID:???
改行コードは Perl の I/O ルーチンが実行環境に合わせて勝手に変換する
そうさせない方法があったはず
0528nobodyさん2006/12/26(火) 21:51:44ID:???
OS別の動作考えるぐらいなら
s/chomp/>>509/
にしとけ
0529nobodyさん2006/12/26(火) 23:49:25ID:???
binmodeってwindowsでしか使われてないと思っていた俺ザンギ
0530nobodyさん2006/12/27(水) 11:38:17ID:???
>>529
ふざけるな




俺ザンギ
0531nobodyさん2006/12/27(水) 15:46:35ID:???
最近binmodeつかってないなぁ。open my $fh, '<:raw', $fileとかやるから。
0532nobodyさん2006/12/27(水) 16:52:37ID:Dit2F/dP
$foo{hoge}と$foo->{hoge}ってどう違うんですか?
0533nobodyさん2006/12/27(水) 17:25:34ID:???
@fooに\%hoge、\%barなどのリファレンスが格納されている場合、個々の値にアクセスする方法はどうすれば良いですか?
05345332006/12/27(水) 17:57:11ID:???
テストスクリプトとして、以下のようなものを作ってみたんですが・・・個々の値にアクセスできません><;

my $aaa = {
    a => 'あ',
    b => 'い',
    c => 'う'
};

my $bbb = {
    a => 'え',
    b => 'お',
    c => 'か'
};

my $ccc = {
    a => 'き',
    b => 'く',
    c => 'け'
};

my @aaa = (\%aaa, \%bbb, \%ccc);

foreach my $a (@aaa) {
    foreach my $b (keys(%$a)) {
        print %$a->{$b};
    }
}
0535nobodyさん2006/12/27(水) 17:58:45ID:???
>>532
$foo{hoge}:
%fooというハッシュのキーhogeに対応する値

$foo->{hoge}:
$fooに格納されたハッシュリファレンスで示されるハッシュの
キーhogeに対応する値

0536nobodyさん2006/12/27(水) 18:03:24ID:???
>>532
$foo{hoge} ハッシュの値
$foo->{hoge} ハッシュリファレンスの値(デリファレンス)

>>533
$foo[0]->[0]とか$foo[1]->{hoge}とか
0537nobodyさん2006/12/27(水) 18:12:18ID:???
>>534
my %aaa = (
  a => 'あ',
  b => 'い',
  b => 'う',
);
0538nobodyさん2006/12/27(水) 18:16:16ID:???
>>535-536
ご回答ありがとうございますm(_ _)m
ようやく両者の違いがわかりました!

>>537
おお〜出来ました!ありがとうございます!

$aaa = {
};

と

%aaa = (
);

の違いについて分かるサイトはございますか?
前者が名前の無いハッシュなんとかかんとかというのは分かったのですが・・・
0539nobodyさん2006/12/27(水) 18:43:49ID:???
さっきから質問ばかりで申し訳ないです。。。
ハッシュをforeachやwhileでまわすと、例えば>>534の例で言えばc→a→bのように、返される値の順序がバラバラになるんです。
この理由は分かった(というか元々バラバラになるようになっている)のですが、これは番号を振ってsortしなくてはいけないのですか?
0540nobodyさん2006/12/27(水) 19:01:43ID:???
できた〜
いちいち番号を振らなくてもsortで出来るんですねヽ(・∀・)ノ
0541nobodyさん2006/12/27(水) 19:08:24ID:???
解決したみたいだけど、ハッシュでは順番は保存されません。実装上の都合です。
理由は「ハッシュ」という名前に関係してるんだけど、
詳しく知りたければ「ハッシュテーブル」を検索してみてね。
0542nobodyさん2006/12/27(水) 19:15:48ID:???
>>538
%aaa = (
);
なら
$fhoge}

ttp://www.rfs.jp/sb/perl/02/10.html
ここなんかどうだろうか
0543nobodyさん2006/12/27(水) 19:17:09ID:???
うおー途中というかわけわかんないところで送信してもうた

%aaa = ();
なら
$aaa{hoge}

$aaa={};
なら
$aaa->{hoge}
0544JAPU@坂井恋夏 ◆lVJAPUTeX. 2006/12/27(水) 20:12:52ID:???
ハッシュの順番を保持したい場合、Tie::IxHash とか使うと幸せになれるかもしれません。
0545nobodyさん2006/12/27(水) 20:17:56ID:???
リファレンスがわからんのにモジュールは酷だろw
0546nobodyさん2006/12/28(木) 00:05:37ID:???
スクリプトで定義した文字列を配列に入れる処理をサブルーチンの呼び出しの度にやっていたんだけど、
グローバル変数 (中括弧で囲われていない部分で my 宣言) にして 1回書き込むだけにしたら、
スクリプト全体の実行速度が 10倍以上になった。

my @dasabase = (
  ['aa', 'ab', 'ac', 'ad');
  ['ba', 'bb', 'bc', 'bd');
  ['ca', 'cb', 'cc', 'dd');
  ['da', 'db', 'dc', 'dd');
);

みたいな 5KB 程度のデータを多次元配列にいれてるだけなんだけど、(サブルーチンの呼び出し回数は 500回ぐらい)
Perl の配列処理が遅いのか、5KBのデータが重いのかは知らないけど、今時のハイスペックなマシンでも、ただ短いデータを代入するだけの処理で
リソース食いつぶしたりするもんなんだね。
0547nobodyさん2006/12/28(木) 00:39:59ID:???
掲示板を作成しているのですが、とある事情で、ログファイルを完全に公開したいと考えています。

記事修正用のパスワードはユーザ任せにするわけですが、crypt 関数でハッシュ化したものを記録すると
ログに記載されたパスワードのハッシュからパスワードクラックされる危険はどの程度あるのでしょうか?

(パスワードは6文字の英数字の場合)

また、crypt よりも安全な一方向関数はありますでしょうか?

よろしくお願いします。
0548nobodyさん2006/12/28(木) 00:55:31ID:???
>>547
今時のPCだとcryptで6文字とかそらもうあっさり解析される。
とりあえずお手軽なところではMD5あたりだと思うが、
そもそもパスワードのログだけ別ファイルにすれば良くね?
0549nobodyさん2006/12/28(木) 00:56:23ID:???
ログファイルを第三者に完全公開する「とある事情」って何だ
それによってアウローチが変わると思われ
0550nobodyさん2006/12/28(木) 01:08:04ID:???
saltを $1$........$ みたいな形で与えると、別の形式でcryptしてくれたりするみたいだね。
0551nobodyさん2006/12/28(木) 02:53:29ID:???
ハッシュ化したものを生でログに置くからすぐばれる。
XORなどのビット演算で数回かき回したものを置けば、元のパスワードは判別不能になる。
もちろん、かき回しロジックを公開しては意味がない。
0552nobodyさん2006/12/28(木) 09:03:40ID:???
アルゴリズムを隠すことによる秘密はよくないよ。
05535472006/12/28(木) 09:53:44ID:???
>>548-549
回答ありがとうございます。

操作性とスクリプトの簡略化のために、トリップキーと削除・編集パスワードを同じものにしたいので、
必然的にパスワードを一方向関数で変換した値は公開されちゃうんです。(トリップとして)

tripper のようなトリップ解析ツールでも6文字なら1日以内に解読できちゃうので、やはり危険ですよね。

>>550
なるほど
http://www.tohoho-web.com/wwwperl2.htm#crypt
そうすればMD5が使えるみたいですね

>>551-552
自分のサイトだけで使ってるならかき混ぜでもばれなさげですね。。。
まぁ基本的に隠蔽によるセキュリティはよくないですが。


よく考えてみると、トリップとして公開するデータをパスワードの一方向関数変換結果の一部にしちゃえば
解読が困難になりそうですね。

ありがとうございました。
0554nobodyさん2006/12/28(木) 13:58:02ID:hVZzWyfv
いろいろなソースを見て勉強しているんだけど、コンストラクタで

my $self = {};
my $self = [];

この2通りの記述を見ました。
{}と[]の違いってなにかあるんですか?

あと、それらに空要素を入れる場合、=0や=''ではなく={}や=[]とする理由も加えてご教示願います。。。m(_ _)m
0555nobodyさん2006/12/28(木) 14:02:16ID:???
$aaa={}; # ハッシュリファレンス
$aaa=[]; # 配列リファレンス
@aaa=(); # 配列
$aaa=''; # スカラー
0556nobodyさん2006/12/28(木) 14:04:14ID:???
>>538,554
オマイラとりあえずperlreftut嫁
ttp://www.kt.rim.or.jp/~kbk/perl-5.8/perlreftut.html
その質問の答えは全てリファレンスとは何かと言うことを理解することによって得られるから。
0557nobodyさん2006/12/28(木) 14:16:08ID:hVZzWyfv
>>555-556
ありがとうございます!
参考サイトは10回ブックマークに登録しました。
0558nobodyさん2006/12/28(木) 14:27:15ID:???
>>557
ちなみにそのサイト、テンプレ>>2にある
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
だからね。
今回は入門としてとりあえずチュートリアル(perlreftut=perl-reference-tutorial)を紹介したけれど、
ちゃんと理解するためにはperldata、perlref、perllolあたりも読んでおいてほしいところだ。
0559nobodyさん2006/12/28(木) 20:22:01ID:???
現在、Shift-JIS(CP932)しか読み込めない
windows上で動作するアプリケーションで使用するテキストを出力するCGIを作っています。
(スクリプトのエンコードはEUCJP)。
現時点では次のような処理をしています。

    投稿ページをEUCのHTMLで出力
           ↓
  投稿ページからPOSTされた文字列を加工して
  Shift-JIS(CP932)に変換してテキストファイルに保存
  (変換にはJcode::CP932モジュールを使用)
           ↓
テキストファイル(CP932)を読み込んでEUCに変換して整形してHTMLに出力
(変換にはJcode::CP932モジュールを使用)

自宅鯖で使う分には良いのですが、Jcode::CP932モジュールは殆どの鯖に入ってないので、
レンタルサーバで使うにはモジュールの追加を依頼する必要があります。

そこで質問です。
1、バージョン5.8のperlの標準的なモジュールのみでEUC-JPとCP932の相互変換は出来ますか。
  もし出来るなら方法を教えてください。
2、Encode.pmでCP932とEUCJPの相互変換は出来るのか、出来るなら方法を教えてください。
3、スクリプトをUTF-8で記述して、use utf8を使用してCP932とUTF-8を
  相互変換したほうが良いのでしょうか。
  その際、CP932とUTF-8を相互変換は標準的なモジュールのみで可能でしょうか。
0560nobodyさん2006/12/28(木) 20:34:13ID:???
Jcodeはパス通せば置くだけでしょ
0561nobodyさん2006/12/28(木) 20:41:34ID:???
>>559
Jcode-CP932っての探して見てみたが>>560の言うとおりインストールしてもらう必要は無い。
libディレクトリ以下適当にコピーしてuse libなりなんなりすれば動く。

1.
極端な話自分で変換テーブルを用意すれば変換できるわけだけれど、
CP932との変換機能が用意されているかと言えばNO。
2.
可能。非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3.
私はそっちのほうが好きではあるが別にその必要は無い。
変換については1,2のとおり。
0562nobodyさん2006/12/28(木) 20:52:26ID:???
Windows Vistaのお陰でUnicode関係の変換がさらに面倒になるね
0563nobodyさん2006/12/28(木) 22:47:30ID:/nHSB5ow
かなり初歩的なことかもしれませんが・・

CGIでパラメータを受け取る時に、ハッシュテーブルに入る変数の数が
不定の場合に、ループ処理を使って、うまく値を取り出すにはどうしたら
良いでしょうか。
パラメータ↓
aaa=テキストa&bb1=テキストb1&bb2=テキストb2&..bbx=テキストbx&ccc=テキストc
bb1〜bbxまでの値を取得したい・・。

良い方法がありましたら、ご教授よろしくお願い致します。
05645632006/12/28(木) 22:54:40ID:???
え、っと自己レスです
>>563 わざわざハッシュにしなくても、bb1〜bbxだけ普通の配列に入れたらイイ?

良案お待ちしておりますー。
0565nobodyさん2006/12/28(木) 23:18:32ID:???
>>563
<form name="bb[]" value="テキストb1" />
<form name="bb[]" value="テキストb2" />
<form name="bb[]" value="テキストbx" />
みたいにしておいて、パラメータ解釈時に/(.*)\Q[]\E$/な要素を
push @{$params{$1}}, $value;
するのが常套手段ではないかと。
0566nobodyさん2006/12/28(木) 23:20:10ID:???
うわぁ、HTMLミスってるorz
s/form/input type="text or hidden"/g
0567 ◆TWARamEjuA 2006/12/29(金) 00:36:46ID:????BRZ(6677)
for my $bb_keys (grep /^bb./, keys %hash) {
:
:
}
とか?
0568nobodyさん2006/12/29(金) 01:12:17ID:???
>>561
おれ、

use Encode qw(from_to);
from_to($hoge, 'cp932', 'euc-jp');
from_to($hoge, 'euc-jp', 'cp932');

で変換して使ってるけど、非標準モジュール入れた記憶ないなあ。
05695612006/12/29(金) 01:31:54ID:???
>>568
あーごめんなさい。>>561は撤回…完全に記憶違いです…
CP932との変換テーブルはデフォルトで入ってるのか。

無いのはMicrosoft仕様のEUCJP-msね。
丸囲み文字とかローマ数字とかそういうやつがEUCJPに変換できないのか…

1. EUC-JPとの変換はできるが一部CP932が拡張している一部の文字について変換できない。
2. 可能。完全に変換するためには非標準モジュールEncode-EUCJPMS。但し要コンパイル。
3. 標準モジュールのみで可能。
で合ってるかな…まあなんにしろ一度派手に記憶違いしてた人の回答なんて
信用できませんので誰か詳しい人お願いしますillorz
0570nobodyさん2006/12/29(金) 01:40:21ID:???
>>560,561
パスを通せば動くんですか。。。
use libの使い方が良くわからなかったので、検索しました。
結構使えそうですね。ただ、コンパイルの必要なモジュールには使えないかも。
use utf8にも挑戦してみます。
use utf8を知る前に投稿を受け取る部分を作ったので
文中で正規表現で2バイト文字を使うために\nxx\nxxで文字を記しているので
面倒になるかもしれませんが。

>>568
Encodeでも可能なんですかね。ちょっとやってみます。

>>569
Jcode::CP932では上のほう(>>404)で話が出ていた���A�ケも�O���Uも上手に変換できていたので
もしかしたらいけるかもしれません。ちょっとやってみます。

#文字コード変換は鬼門ですね。
0571nobodyさん2006/12/29(金) 02:16:03ID:???
結果です。

まず、use Encode qw(from_to);での結果。
from_to($huga, 'cp932', 'eucjpms');
ダメでした。
���A�ケ�O���Uと続けて記入したデータが??????に化けました。

次にEncode::EUCJPMSを読み込ませた上で
↓のように記述してみました。
from_to($huga, 'cp932', 'eucjpms');
これもダメでした。���A�ケが全角空白に変換され   �O���Uと出力されてしまいました。

3、のuse utf8は時間が掛かるので明日にでも全改修してやってみます。
0572nobodyさん2006/12/29(金) 02:29:36ID:???
>>571
eucjpmsじゃなくてcp51932だとどうだろ
ttp://msyk.at.webry.info/200511/article_2.html
ttp://legacy-encoding.sourceforge.jp/wiki/index.php?cp51932

こちらで確認したところそれらの文字は全部通った。
0573nobodyさん2006/12/29(金) 02:35:41ID:???
失礼。全角空白ではなく FD FF FD FF FD FF という良くわからない文字列でした

>>572
from_to($ds, 'cp932', 'cp51932');
OKでした。でも、このcp51932ってエンコードって5系perlには標準で入ってましたっけ。
EUCJPMSはロードしなくても出来たので、最新版のEncodeでは標準のようですが。
0574nobodyさん2006/12/29(金) 02:43:29ID:???
>>573
ありゃ?
ttp://search.cpan.org/~naruse/Encode-EUCJPMS-0.07/EUCJPMS.pm
に書いてあるからEncode::EUCJPMSが提供しているものだと思ったんだけど。
そして当方ではロードしないとUnknown encodingとエラー起こしてる…
>perl -MEncode -e "print $Encode::VERSION"
2.18
0575nobodyさん2006/12/29(金) 03:05:50ID:???
>>574
私の使ったEncode::EUCJPMSをロードしないと言うのは
use Encode::EUCJPMS
と、記述しないと言うことですが。。。

って、use Jcode::CP932を書いたままでした。
Jcode::CP932内でEncode::EUCJPMSを呼んでるので動いたのでしょう。

となると、標準モジュールのみでやるにはやはりuse utf8プラグマをつけないとダメってことですかね。
それでも動くかどうかは判らないですが。
0576nobodyさん2006/12/29(金) 04:26:07ID:???
超低レベルな質問かもしれませんが、お願いします。

現時点でhtmlで簡単なサイトぐらいなら作れる、人並みの脳みそを持った人が、
仕事の合間を縫ってそれなりに勉強して、Perlを使ったCGI(初歩的な掲示板など)
をゼロから作れるようになるには何ヶ月ぐらいかかりますか?

個人的な感覚で構いませんので、どう思うか教えて下さい。
0577nobodyさん2006/12/29(金) 05:57:46ID:???
>>576
3日間
05785772006/12/29(金) 05:58:43ID:???
あ、プログラミングの経験が普通の高校で習った程度しかないなら、1ヶ月間ぐらいで。
0579nobodyさん2006/12/29(金) 10:17:46ID:???
条件が曖昧過ぎるからなんとも言えないけど
やっぱ1ヶ月ぐらいかなー
0580nobodyさん2006/12/29(金) 10:48:29ID:???
最初のプログラミング言語としてperlを選択するのは止めなさい。
一生perlしか使わないつもりなら止めないけど。
05815632006/12/29(金) 10:51:17ID:???
>>565,>>567
ありがとうございます。実はPerlは今週はじめたばかりで、
そんな風に出来るんだ〜・・などと感心してました。

で、この結局こんな感じで進めました。

if($key =~ /^bb\d$/){ push @bb_vals, $val; } #キーが"bb[0-9]"の処理
elsif($key =~ /^dd\d$/){ push @dd_vals, $val; } #キーが"dd[0-9]"の処理
else{ ハッシュテーブル作成 }

�@入力フォームに、ラジオボタンが数種類 × 数グループあったので、
nameを同じにすると ややこしい感じに
�Aフォームの順番も重要だったので、順不同なkeysは今回は使いにくそう
な感じでした。
これからまた、お世話になるかもしれません。よろしくお願いします。

>>576
プログラムかUNIX系の知識があれば、一週間もあれば。
それ以外であれば、やっぱりひと月でしょうねー。
0582nobodyさん2006/12/29(金) 12:44:22ID:???
何を習得するにも、>>580みたいな意見には惑わされないように。
0583nobodyさん2006/12/29(金) 13:41:38ID:???
俺も580と同意見だな。
やるならCから入った方がいい・・・と、Cから入った俺がry
■ このスレッドは過去ログ倉庫に格納されています