くだすれPerl(超初心者用)3
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/03/31(火) 22:20:27ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/
関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0241nobodyさん
2009/08/22(土) 10:40:35ID:???$1の初期値が「0」ってことはないだろうし。
0242nobodyさん
2009/08/22(土) 11:10:48ID:???>>240の言葉を借りれば、グローバルなレキシカル変数$1(下の(1))と、forループ内で
$i =~ /(.)/;より下で有効なレキシカル変数$1の2つが混在していると。
$s = 0;
$s =~ /(.)/; #=> my $1 = "0" ・・・(1)
for($i=4; $i>0; $i--) {
print "$1\n"; "=> この時点では1つ上のスコープのグローバルな$1、すなわち(1)を表示
$i =~ /(.)/; #=> my $1 = $i ・・・(1)のグローバルなレキシカル変数$1は、一旦ここで見えなくなる
}
0243nobodyさん
2009/08/22(土) 12:04:28ID:???では、面白い例を。結果は0432。
my $s = 0;
$s =~ /(.)/;
foreach(reverse 1..4){
print $1, "\n";
/(.)/;
}
0245nobodyさん
2009/08/25(火) 18:13:21ID:???別に現状では何も問題が無いんですが、何の意味があるか良くわかりません。
if 文で変数が未定義だったら何をしているんでしょうか?
$stlist{$kumi}{$bangou}= [] if ! exists $stlist{$kumi}{$bangou};
0246nobodyさん
2009/08/25(火) 22:37:47ID:???use warnings;
my %stlist = ();
my $kumi = 1;
my $bangou = 2;
$stlist{$kumi}{$bangou} = 3;
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
undef $stlist{$kumi}{$bangou};
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
--
>perl test_perl.pl
3
Use of uninitialized value in print at test_perl.pl line 14.
0247nobodyさん
2009/08/25(火) 22:54:19ID:???$stlist{kumi}{bango} ||= [];
で同じことできるんだけどな
0249nobodyさん
2009/08/26(水) 09:57:20ID:???意味はモヤッと解ってきたのですが「[]」 の使い方が解らないんです。
「()」では駄目なんですか?
0250nobodyさん
2009/08/26(水) 18:52:28ID:mCRAV2Yd0251nobodyさん
2009/08/26(水) 21:01:17ID:???() 配列
[] 配列のリファレンス
ここで
$hoge = ();
とすると、多分スカラーコンテキストで無名配列が評価されるので0が入る
$hoge = [];
だと配列のリファレンスが入るから、何も値が入ってない状態で
$hoge->[0]
とかやってもうまく動く
多分ね
0252nobodyさん
2009/08/27(木) 02:29:49ID:???my $hoge = [1, 2, 3, 4, 5];
my $huga = [6, 7, 8, 9];
という風に二つの配列へのリファレンスがあったとして、
この二つの配列を合わせた配列へのリファレンスを新しく作るには
my $kei = [ @{$hoge}, @{$huga} ];
以外に方法はありますか?
いろいろ試してみたんですが上手くいかなくて…。
0253nobodyさん
2009/08/27(木) 05:43:28ID:???regular expression
オレオレスクリプト以外に使用厳禁↓
http://search.cpan.org/dist/String-Scanf-2.1/lib/String/Scanf.pm
>>251
undefがはいるよぉぉぉぉぉぉ。
>>252
考えすぎるとハゲるぞ。
おめーら、クソスレより初心者スレ使えよ。
0254nobodyさん
2009/08/28(金) 10:14:29ID:???してるんだけど, 一緒に要求される DBI::DB2 が入らない.
ubuntu 8.04 用の DB2 deb パッケージを入れたあと
$ sudo su
# export DB2_HOME=/opt/ibm/db2exc/V9.5
# cpan DBI::DB2
すると, include するべきヘッダが無いらしく, 大量の未宣言エラーが出る。
DB2 自体をソースからコンパイルして make install するしか無いかな?
というか DB2 は使う予定が無いから, DBI::DB2 自体をスルーしたいのだけど...
ちなみに CPAN-Testers でもインストール成功例は無いようです.
ttp://static.cpantesters.org/distro/D/DBD-DB2.html
0256254
2009/08/28(金) 13:30:37ID:???それでですね...
ずらずら出るエラーメッセージを見ていたら, include 出来ずにエラー出してるのは
DBIXS.h とかだったので, cpan DBI してみたらビンゴ.
無事 DBD::DB2 のインストールに成功しました.
しょうもないオチですまんかった. 付き合ってくれた >>255 ありがとう.
0257nobodyさん
2009/08/31(月) 21:28:16ID:SNcF+RG0if ($r =~ /str/){exit;}
↑マッチしたら偽判定にするにはどうしたらいいの?
0258nobodyさん
2009/08/31(月) 21:28:57ID:SNcF+RG0$s="str"
if ($s =~ /str/){exit;}
0259nobodyさん
2009/08/31(月) 22:32:07ID:???0260nobodyさん
2009/09/01(火) 02:45:08ID:???0261nobodyさん
2009/09/04(金) 13:32:16ID:???if ($r !~ /str/){exit;}
if ( ! $r =~ /str/){exit;}
if (not $r =~ /str/){exit;}
unless($r =~ /str/){exit;}
すきなの使え。この条件ならunlessも!~もほとんど差がないと思うぞ。
0262nobodyさん
2009/09/04(金) 20:00:55ID:???どうすればいいでしょうか?戻るボタンや戻るボタンの過去の履歴を
押しても、最後にいたページにリダイレクトされるようにしたいんですが、
できるでしょうか?
0263nobodyさん
2009/09/04(金) 20:22:09ID:???つか毎回ログつくってしまうかクッキーで管理すればおk
0264nobodyさん
2009/09/05(土) 04:55:23ID:UpeEOLWycgi以外で
0265nobodyさん
2009/09/05(土) 06:08:28ID:???ていうかwperl知らんのけ
0266nobodyさん
2009/09/05(土) 06:30:25ID:UpeEOLWyありがとう
0268nobodyさん
2009/09/05(土) 12:52:13ID:???0269nobodyさん
2009/09/05(土) 14:46:03ID:???ありがとうございます。さっそくググって勉強中ですが、cakeやらsymfonyやら
あるようですが、私の用途ですと、どれを使っても問題ないでしょうか?
>>263
リダイレクト関連でheaderを勉強して、キャッシュが残らないように設定して、途中で
「戻る」と、問題がテスト開始前に設定した問題数分最初から出題されるように
なったので(同時にセッションも新規セッション)、20問なら20問後戻りせずに解かせる
という最低限やりたいことは、これで対処できるようになったかと思います。
>>262で質問した内容とはまだ少し違いますが。ありがとうございます。
0270nobodyさん
2009/09/06(日) 07:34:15ID:???cakeとかPHPだろ。とりあえずCatalyst使っとけ。他にもあるがCatalystは少し枯れてるし情報も豊富。
中規模以のアプリケーションを楽しく書きたいならフレームワーク一択。
0271nobodyさん
2009/09/06(日) 10:19:40ID:???まずはそこをはっきりさせた上で他人に勧めてくれないか。
0274nobodyさん
2009/09/09(水) 16:52:27ID:???print $value;
}
これって駄目なの?
0275nobodyさん
2009/09/09(水) 17:52:15ID:???foreach $value (keys %{$DATA{$unko}}){
print $value;
}
0276nobodyさん
2009/09/09(水) 17:57:47ID:???と2回言ってるようなもの
簡単にいえば無駄な書き方
0278nobodyさん
2009/09/09(水) 20:53:19ID:???1. $DATA{$unko} はハッシュの要素であり、その例の場合は値としてハッシュリファレンスを持っている。
# その点は print $DATA{$unko} してみるとわかる。
# 恐らく "HASH(0xdeadbeef)" 的なものが表示される。
2. keys() は引数としてハッシュそのものしか取らず、従ってハッシュの要素は受付けない。
3. ハッシュリファレンスをハッシュとして扱うためにはデリファレンスを行う必要がある。
4. ハッシュとして明示的にデリファレンスするには、リファレンスを "%{ }" でくくる。
perlreftut, perlref 及び perllol の各 perldoc も参照してください。
>>274
%DATA{$unko} # これはありがちな文法ミス
%DATA {$unko} # <- こうパースされる
0279nobodyさん
2009/09/09(水) 23:42:35ID:???そのりくつはおかしい
my %hash = ( data => {hoge => 'huga', foo => 'bar'});
print $hash{data}, "\n"; #=> HASH(0x9c4a880)
print %{$hash{data}}, "\n"; #=> foobarhogehuga
print keys %hash, "\n"; # => data
print keys %{$hash{data}}, "\n" #=> foohoge
ほら、明らかに違うもの指してるでしょ
0280nobodyさん
2009/09/10(木) 12:07:31ID:jH+1ZMcmデッドロックが発生してしまいます。
これを検知して作業を続行するにあたり、evalでexecuteを見張る以外に
何かいい方法はありますか?
0281nobodyさん
2009/09/10(木) 12:33:59ID:???0282nobodyさん
2009/09/10(木) 12:41:38ID:???0283sage
2009/09/10(木) 15:42:38ID:jH+1ZMcmええ、その通りなんですがその方法が解らず・・・
>>281
DBI 排他ロックのキーワードで解決できそうです
ありがとうございます。
0284nobodyさん
2009/09/11(金) 17:02:10ID:???>>278
なんとなくですが解りました。ありがとうございます。
perldocを読破しないと似た問題には対応出来ないですね・・・
ハッシュは複雑すぎる
0285nobodyさん
2009/09/11(金) 23:11:01ID:???ボタンを更新後数秒間物理的に押せないようにしたいと思い
色々調べてみましたがいい案が浮かびませんでした
何かよい案があればお力添えを戴けませんでしょうか
0286nobodyさん
2009/09/11(金) 23:16:11ID:???0287nobodyさん
2009/09/11(金) 23:28:49ID:???即レス有難うございます 書き込みながらググってますがどうもピンときません
超初心者のレベルにも達してないということですね…吊ってきます
0288nobodyさん
2009/09/12(土) 03:01:13ID:???html disabled とほほ
送信ボタンをdisabledにして数秒スリープして元に戻す関数を送信ボタンクリックボタンにトリガーする感じ?
ただ直接URL叩かれてたら無意味
0289nobodyさん
2009/09/12(土) 10:46:01ID:???時刻とIPアドレスのハッシュを一定時間保持しといて
マッチしたらはじくとかでもいいかと
0290285
2009/09/12(土) 11:10:28ID:???本当にドがつくレベルなので出来るかどうかわかりませんが
もう少しがんばってみますね
0291285
2009/09/12(土) 12:25:36ID:???元に戻すというのが理解できず詰まってる状態です
もう少し色々試してみますね
0292nobodyさん
2009/09/15(火) 03:11:36ID:m9vb+1wpループ毎に別のハンドルに切り替えたいのだけれど
0293nobodyさん
2009/09/15(火) 10:52:12ID:???use IO::File;
my @fhs = map { IO::File->new($_, "r") } qw(file1 file2 file3 ......);
0294nobodyさん
2009/09/15(火) 11:43:17ID:???ファイルハンドルはベアワードではなくレキシカル変数に入れろ
と啓蒙する動きが見られるようになったけど、
そうすることによって出来ることも増えるのだなぁと今思った。
0295nobodyさん
2009/09/23(水) 18:54:15ID:???1 9 16 20 21 43 5
1 5 15 31 36 38 13
最近、コード打ってなくて、頭が回らんので助けてくだあい
1回目=1行 のデータがたくさんあって
この中から、各数字の組み合わせの頻度を出したいのですがループの回し方が思い浮かばず
2-9の組み合わせ○回
2-10の組み合わせ○回…というように。
上記のようなファイルが用意してあって
それを1line読み込んで、ループに回す、と考えているのですが
スマートなループを教えてください。
0297nobodyさん
2009/09/23(水) 22:41:30ID:???説明しやすいように1行に3つの数字とする。
1 2 3 #=> 2つの組み合わせ=1-2、1-3、2-3
1 3 5 #=> 2つの組み合わせ=1-3、1-5、3-5
2 3 6 #=> 2つの組み合わせ=2-3、2-6、3-6
1-2の組み合わせの登場は1回
1-3の組み合わせの登場は2回
1-5の組み合わせの登場は1回
2-3の組み合わせの登場は2回
2-6の組み合わせの登場は1回
3-5の組み合わせの登場は1回
3-6の組み合わせの登場は1回
0298nobodyさん
2009/09/23(水) 23:47:33ID:???把握した
my (@data, %hash);
@data = (
[1, 2, 3],
[1, 3, 5],
[2, 3, 6],
);
foreach my $row(@data){
foreach my $i(0..$#$row){
foreach my $j(($i + 1)..$#$row){
my $key = ($row->[$i] < $row->[$j]) ? "$row->[$i]-$row->[$j]" : "$row->[$j]-$row->[$i]";
$hash{$key}++;
}
}
}
print "$_の組み合わせの登場は$hash{$_}回\n" foreach sort keys %hash;
0299nobodyさん
2009/09/24(木) 23:09:26ID:BEttX1dB0300nobodyさん
2009/09/25(金) 01:20:19ID:???入ってなけりゃSSHかなんかでユーザ領域インストールすりゃいいんじゃね
0301nobodyさん
2009/09/27(日) 16:08:13ID:dRLFhFfi$mech->submit_form(
form_number => 1,
fields => {
FROM => '',
mail => '',
MESSAGE => 'aaa',
}
);
でポストすると
http://jfk.2ch.net/test/read.cgi/mmo/test/bbs.cgi?guid=ON
に飛ばされてしまいます
mech-dumpで見てみるとスレッドのフォームでポストすべきものは
submit=書き込む(HTML設定済み) (submit)
FROM= (text)
mail= (text)
MESSAGE= (textarea)
bbs=<板識別子(HTML設定済み)> (hidden readonly)
key=<スレッドナンバー(HTML設定済み)> (hidden readonly)
time=<時間(HTML設定済み)> (hidden readonly)
となっているので$mechでサブミットすべきものはFROM,mail,MESSAGEと
認識してるんだけどこれ間違ってますか?
0302nobodyさん
2009/09/27(日) 16:34:12ID:???0303nobodyさん
2009/09/27(日) 18:33:21ID:???0304nobodyさん
2009/09/28(月) 00:39:43ID:???0305301
2009/09/28(月) 08:23:50ID:ae4P5TMoクッキーが必要でないだろう初回書き込みのポスト(書き込み確認画面へ移動)
が通らないんですよね・・・
0306nobodyさん
2009/09/28(月) 09:32:00ID:???専ブラとかもそのせいで書けなくなって、一時期話題になってるから
探せばすぐにわかると思う
0307301
2009/09/28(月) 09:48:59ID:???またちょっと自力で奮闘してみます
お騒がせしました。
0308nobodyさん
2009/09/30(水) 10:06:13ID:???0309nakacyan
2009/10/01(木) 09:38:30ID:Q77nXvDi現在、大学の課題でミリセック単位での処理時間を計算するスクリプトを作成しているのですが、
どうロジックを組めばいいのかわかりません。
肝になるのは識別子でソートをすることとms単位で時間差分をとることだと思うのですが、
後者はtime関数等を使えば実現できるのでしょうか?
ヒントになりそうなスクリプトをいご教授いただけると助かります。
課題は以下になります。
あるPCの処理時間を出力したmeiji_test001.csv meiji_test002.csv というファイルがある。
ファイルの詳細は以下。
meiji_test001.csv
ファイル名,処理時間,区別,識別子
meiji_test001,01:30:22.392,S,SHJAKIU02387HQ87OK.dd1
meiji_test001,01:31:44.223,S,LKIE832JUH20KJKKKH.dd1
meiji_test001,01:35:56.356,S,KJNEYHQPLK95718HNJ.dd1
meiji_test001,01:36:47.313,S,OQI81KMHFDJ98NBHJI.dd1
meiji_test001,01:40:14.009,S,09KAJNMCVZH83KJEUL.dd1
meiji_test001,01:42:58.763,S,KJQPOI045KMNJKMAUU.dd1
meiji_test001,01:43:59.443,S,KI948MMNGYWUQIIIOK.dd1
0310nakacyan
2009/10/01(木) 09:40:29ID:Q77nXvDi続きです
meiji_test002.csv
ファイル名,処理時間,区別,識別子
meiji_test002,01:30:21.002,R,SHJAKIU02387HQ87OK.dd2
meiji_test002,01:31:24.003,R,LKIE832JUH20KJKKKH.dd2
meiji_test002,01:34:22.106,R,KJNEYHQPLK95718HNJ.dd2
meiji_test002,01:35:22.003,R,OQI81KMHFDJ98NBHJI.dd2
meiji_test002,01:39:06.009,R,09KAJNMCVZH83KJEUL.dd2
meiji_test002,01:41:40.103,R,KJQPOI045KMNJKMAUU.dd2
meiji_test002,01:42:34.023,R,KI948MMNGYWUQIIIOK.dd2
それぞれのファイル内で識別子をキーに処理時間を比較し、
同一のものがあれば処理時間を計測し、ログファイルに出力せよ。
同一のものが存在しない場合はなにも処理を行わない。
処理時間はミリセック単位(ms)で表示し、ログファイルには以下の形で出力すること。
※区別Rには処理時間を出力しない。
meiji_Kekka.csv
ファイル名,処理時間,区別,識別子,処理時間
meiji_test001,01:30:22.392,S,SHJAKIU02387HQ87OK.dd1 01.390
meiji_test002,01:30:21.002,R,SHJAKIU02387HQ87OK.dd2
meiji_test001,01:31:44.223,S,LKIE832JUH20KJKKKH.dd1 20.220
meiji_test002,01:31:24.003,R,LKIE832JUH20KJKKKH.dd2
meiji_test001,01:35:56.356,S,KJNEYHQPLK95718HNJ.dd1 01.34.250
meiji_test002,01:34:22.106,R,KJNEYHQPLK95718HNJ.dd2
meiji_test001,01:36:47.313,S,OQI81KMHFDJ98NBHJI.dd1 01.25.310
meiji_test002,01:35:22.003,R,OQI81KMHFDJ98NBHJI.dd2
meiji_test001,01:40:14.009,S,09KAJNMCVZH83KJEUL.dd1 01.08.000
0313nobodyさん
2009/10/01(木) 12:16:35ID:???ム板の宿題スレ逝けよ。webprogじゃねーし。
つか単純にsec*1000でmsの精度にすればいいだけの話に見えるけどな。
0314nobodyさん
2009/10/01(木) 12:26:41ID:???0315nobodyさん
2009/10/01(木) 13:49:13ID:???sub f{local$_=$_[0];/(\d{1,2}):(\d{1,2}):(\d{1,2})\.(\d{1,3})/?($1*3600000)+($2*60000)+($3*1000)+$4:undef}
0316nobodyさん
2009/10/01(木) 19:01:07ID:???0317nobodyさん
2009/10/01(木) 21:32:35ID:???勉強中の自分にちょうどよい題材なので作った。
>>317-319がそのコード。
my $file1 = 'meiji_test001.csv';
my $file2 = 'meiji_test002.csv';
my $output_file = 'meiji_Kekka.csv';
my %data_of;
open my $fh, $file2 or die $!;
my @labels = split /,|\n/, <$fh>;
while ( my $line = <$fh> ) {
chomp $line;
my @data = split /,/, $line;
my $id = ( split /\./, $data[3] )[0];
$data_of{$id} = \@data;
}
close $fh;
0318nobodyさん
2009/10/01(木) 21:33:21ID:???print {$out} join(',', (@labels, '処理時間')), "\n";
open $fh, $file1 or die $!;
<$fh>;
while ( my $line = <$fh> ) {
chomp $line;
my @data = split /,/, $line;
my $id = ( split /[.]/, $data[3] )[0];
if ( exists $data_of{$id} ) {
print {$out} join(',', @data), ',';
print {$out} interval(Start => $data_of{$id}[1], End => $data[1]), "\n";
print {$out} join(',', @{$data_of{$id}}), "\n";
}
}
close $fh;
close $out;
0319nobodyさん
2009/10/01(木) 21:34:59ID:???my %time_of = @_;
my (%sec_of, %interval);
my @sec_for_unit = ( { unit => 'hour', sec => 3600 }, { unit => 'minute', sec => 60 } );
while ( my ($when, $time) = each %time_of ) {
if ( $time =~ /^(\d+):(\d+):(\d+\.\d+)$/ ) {
$sec_of{$when} = $1*3600 + $2*60 + $3;
} else {
require Carp;
Carp::croak("Invalid time format : $time");
}
}
$interval{sec} = $sec_of{End} - $sec_of{Start};
for my $hash (@sec_for_unit) {
my ($unit, $sec) = ($hash->{unit}, $hash->{sec});
if ( $interval{sec} >= $sec ) {
$interval{$unit} = int $interval{sec} / $sec;
$interval{sec} -= $interval{$unit} * $sec;
}
}
my $interval_time;
$interval_time .= sprintf '%02d:', $interval{hour} if $interval{hour};
$interval_time .= sprintf '%02d:', $interval{minute} if $interval{minute};
$interval_time .= sprintf '%06.3f', $interval{sec};
return $interval_time;
}
0320nobodyさん
2009/10/01(木) 21:40:23ID:???だからこそ課題になってるってのになぁ・・・
最近の学生はホントゆとり過ぎる
0321nobodyさん
2009/10/01(木) 22:24:45ID:???実験としてCGIに無限にPOSTするのをつくったんですが、どうもうまくいかないです。ループをきると正常に作動しますけどループをいれた瞬間動かないです。コンパイルエラーはでないのに・・・。以下ソース複数で書き込みします
#!/usr/local/bin/perl -w
use strict;
use Socket;
open(IN,"hoge.txt");
my $Length;
my (@list,$line);
while($line = <IN>){
Connect();
@list = split(/\t/,$line);
$Length = length($list[1]) + 5;
print SOCKET "POST /manko.cgi HTTP/1.0\r\n";
print SOCKET "Content-Length: $Length\r\n";
print SOCKET "\r\n";
print SOCKET "unko=$list[1]\r\n";
while(<SOCKET>){
m/^\r\n$/ and last;}
while(<SOCKET>){
print $_;
}
}
0322nobodyさん
2009/10/01(木) 22:26:10ID:???my($host,$port) = ("localhost","80");
my $iaddr = inet_aton($host) or die "無効なhost!";
my $sock_addr = pack_sockaddr_in($port,$iaddr);
socket(SOCKET,PF_INET,SOCK_STREAM,0) or die "ソケットを作成できなかった!";
connect(SOCKET,$sock_addr);
select(SOCKET); $|=1; select(STDOUT);
return 0;
}
どこがわるいのか指摘お願いします。
whileを($line = <IN>)を$line = <IN>;にすると動くみたいです
0325nobodyさん
2009/10/02(金) 23:48:23ID:fo52aLk6今更なんだがそのSSHとやらを誰か詳しく教えてくれ
0326nobodyさん
2009/10/03(土) 00:12:36ID:???0327nobodyさん
2009/10/03(土) 05:27:39ID:???嫁。
http://ja.wikipedia.org/wiki/Secure_Shell
0328nobodyさん
2009/10/05(月) 03:02:35ID:???map { eval '$' . $_ . ' = $arg{' . $_ . '}' } qw(a b c);
evalをループの中に入れるのは効率が悪いと
あちこちに書いてあったのでevalを外に出したいのですが、
以下のように記述したところ、上手く動いてくれません。
eval q|map { '$' . $_ . ' = $arg{' . $_ . '}' } qw(a b c)|;
どういう風に記述すれば動くようになるでしょうか。
よろしくお願いします。
0329nobodyさん
2009/10/05(月) 05:08:20ID:???$b = $arg{b};
$c = $arg{c};
0330nobodyさん
2009/10/05(月) 07:59:45ID:???こんなんとかはどう?
eval join q{}, map "\$$_ = \$arg{$_};", qw(a b c);
0332nobodyさん
2009/10/05(月) 21:32:31ID:???ホームページを取得するコードを書いたのですが、日本語部分が文字化けします。
ググって、chcp 65001やbinmode STDOUT, ':encoding(cp932)';など試してみましたが、解決できませんでした。
既出の質問かも知れませんが、アドバイスいただれば幸いです。
ソース
#!/usr/local/bin/perl
use strict;
use warnings;
use LWP::Simple;
use utf8;
my $url = "http://yahoo.co.jp/index.html";
my $response_string = get($url);
print $response_string;
[環境]
WindowsXp SP3
ActivePerl 5.8.9 Build 826
Windows メモ帳
ファイル保存形式 utf8
コンソール Windows標準コマンドプロンプト
よろしく、お願いします。
0333nobodyさん
2009/10/05(月) 23:18:28ID:???utf-8からcp932に変換したいのなら、from_toを使えばいいと思います。
my $response_string = get($url);
#-- 追加 --------
use Encode;
Encode::from_to($response_string, 'utf8' => 'cp932');
#---------------
print $response_string;
use utf8の基本は、外部から来る文字列は、Perlの内部表現にし(decodeする)、文字列を
外部に出力するときは、Perlの内部表現から所望の文字コードに変換する(encodeする)
です。
Perlの内部表現はUTF-8を使用しているため、UTF-8で入ってくる外部からの文字列は
変換が必要ないと思われがちですが、内部表現でのUTF-8ではUTF-8フラグというのを
立てて、単なるUTF-8(バイナリ列)と、内部表現でのUTF-8を区別しています。
そのため、UTF-8の文字列であろうと、内部表現にするためには、decodeする必要があります。
質問のコードをその理念に基づいて書き直すと、
use utf8;
use Encode;
binmode STDOUT, ':encoding(cp932)'; # 外部への出力(標準出力)は”内部表現”からcp932に変換
my $url = "http://yahoo.co.jp/index.html";
my $response_string = decode('utf8', get($url)); # 外部から来た文字列は内部表現にdecode
#my $response_string = decode_utf8( get($url) ); # 外部からきた文字列がUTF-8の場合はこれでもよい
print $response_string;
0334nobodyさん
2009/10/05(月) 23:45:50ID:???332です。さっそくのご返答、ありがとうございます。
Perlの内部表現、encode、decodeについて、まだ詳しく理解していないので、これから勉強していきます。
サンプルで書いていただいたコード、見事に文字化けなしで動作しました。
2chに書き込むのは、生まれてはじめてだったのですけど、的確なアドバイスをいただいて感激しました。
0335nobodyさん
2009/10/06(火) 16:20:44ID:o5fGVlDsベストは>>329の回答。
どうしてもなら
map { ${ $_ } = $arg{ $_ } } qw(a b c);
0336nobodyさん
2009/10/06(火) 16:30:58ID:???そこを指摘してあげなよw
0337nobodyさん
2009/10/06(火) 19:46:56ID:???シンボリックリファレンスを使ったやり方ですよね。
それはまず最初に試したのですが、動いてくれませんでした。
no strict 'refs' を使ってもダメでした。
理想は>>329さんのやり方なのだとは思うのですが、
実際は配列の中に入っている変数が10数個ある状態ですので
どうしても冗長になってしまいます。
そこをどうにかできればと思ったのですが…。
0338nobodyさん
2009/10/06(火) 20:07:37ID:???use strict;
use warnings;
my %arg = (a => 1, b => 2, c => 3);
{
no strict 'refs';
map { ${ $_ } = $arg{ $_ } } qw(a b c);
}
{
no strict 'vars';
no warnings 'once';
print "$a, $b, $c\n";
}
掟破りなコードだわな。
普通は使わないので、プログラムを練り直してください。
0340nobodyさん
2009/10/07(水) 14:16:38ID:DCSJgtVa■ このスレッドは過去ログ倉庫に格納されています