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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2009/02/16(月) 11:42:29ID:gvPTpodw
Perlのコーディングで困ってる人のスレです。

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

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

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

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1218030872/
0719nobodyさん2009/06/19(金) 17:12:43ID:???
>>718
food なら m であってるんじゃないの?
それだけで終了するのはなぜかわからないけど。

修正後のスクリプトを見てみたい。
0720nobodyさん2009/06/19(金) 17:16:51ID:???
>>718

> $lineに直してもムリポでした、、、

おおかたchompを直し忘れたんじゃないか。
$lineで統一するんなら明示的に引数書かないと。

> て言うてもエラーではなく、出力は最初のデータがfoodなのにも関わらず"m"と出て糸冬了。
> 心当たり?はわかんないす。

animalのときn,他のときはmだからfoodでmがでて
終了なら正しい動作なんじゃねーの?
07217132009/06/19(金) 17:17:06ID:???
use strict;

while(my $line = <DATA>){
  chomp $line;
  if($line eq "animal"){
    print "n\n";
  }else{
    print "m\n";
  }
}
exit;

__DATA__
animal
plant
food
food
animal

原因は、$line に入れてるのに、chomp は $_ 対して行ってるから。

自分と似たようなミスですねww
07227142009/06/19(金) 17:26:50ID:???
すんません、僕の説明がヘタくそすぎたし、
>>718での報告は完全に間違ってたので、もう一度チャンスをください。
望ましい出力が
animalからのn と
plant, foodからのmです。
>>721さんのやつでやってみると
5000行ほどあるうちの最初がanimalなのにnが出てきまして、
その1つで出力が終わってしまってます。
ご教授、よろしくお願いします。

>>719
>>721さんのをまんま使わせてもらったところ
上に書いたような出力になっちゃいました。

07237142009/06/19(金) 17:28:42ID:???
あーもう、また間違ってる!
foodlなのにnが出ちゃったんですw
ほんますいません。
07247132009/06/19(金) 17:35:12ID:???
__DATA__ は削除しないと・・・


while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
0725nobodyさん2009/06/19(金) 17:36:48ID:???
落ち着けよ
原因はきっとキミがパニクってるからだと思う
07267192009/06/19(金) 17:44:12ID:???
>>722
スクリプトを見せてくれよ。
07277142009/06/19(金) 17:46:28ID:???
>>724
あ、大丈夫です。そこは消したんですが
>>722みたいな感じになっちゃったんです・・

>>725
確かにw
今日中にこれを何とか片付けないとだめなんで若干の焦りがありますよねw
0728nobodyさん2009/06/19(金) 17:54:53ID:???
目茶目茶短いだろうに載せないのはネタだから?
07297142009/06/19(金) 17:56:40ID:???
>>726
while($line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
て感じです。
出力は、nが1つ出ているだけです。
しかも、データの1行目はfoodなのでmが出てほしいんですが。。
0730nobodyさん2009/06/19(金) 18:02:04ID:???
ホントにfoodでmが出てるか↓こう書いて確認したら?
print OUT1 "n: $line\n";
print OUT1 "m: $line\n";
0731nobodyさん2009/06/19(金) 18:03:50ID:???
>>729
とりあえず、chompを外して
条件を
$line =~ /animal/
に変えて試してみれば?

あと、chompの後でも前でもいいけど、$lineをダンプ
07327192009/06/19(金) 18:06:13ID:???
>>729 その前後に問題があるのでは?
ファイルの open, close がうまくいってないとか?

# test.pl
use strict;
open IN1, '<', 'data_in.txt' or die $!;
open OUT1, '>', 'data_out.txt' or die $!;
while(my $line = <IN1>){
chomp $line;
if($line eq "animal"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}
close OUT1;
close IN1;

# data_in.txt
food
animal
plant
food
animal

#data_out.txt
m
n
m
m
n
0733nobodyさん2009/06/19(金) 18:13:59ID:???
ほんとに
animal
なのか?
animal
とかじゃないよね?
0734nobodyさん2009/06/19(金) 18:16:17ID:???
>>721ので上手くいくんだから、もうデータが間違えてるだとか
その前後が間違えてるとしか思えない

スクリプトデータを頂戴
記述間違いから何から何まで直してやる
0735nobodyさん2009/06/19(金) 18:28:26ID:???
use strict;
use warnings;

open IN1, '<', 'testdata.txt';
open OUT1, '>', 'results.txt';
while(my $line = <IN1>){
  chomp $line;
  if($line eq "animal"){
    print OUT1 "n\n";
  }else{
    print OUT1 "m\n";
  }
}
close OUT1;
close IN1;

5000個のデータ作ってやってみたけど、ちゃんと動くし、簡単なチェックスクリプトで確認したけど、
animal なのに m になってしまうなんてのは無かった。
キミの組み方の問題かと思われ。
07367142009/06/19(金) 18:30:29ID:???
>>733
はい、一番処理しないといけないデータはanimalとかじゃなくて別の言葉です。
このanimalとかは、練習用で使ってたデータです。
下に生のデータを掲載させてもらいます。

>>734
スクリプトデータって読み込んだデータのことですよね?
animalとかじゃなくて、実際に処理したいデータはこんなのです。
NonWord
NonWord
NonScriptWord
NonScriptWord
NonWord
NonWord
NonWord
NonWord
ScriptA
ScriptC

こんなのが5000ほどあります。
この中のNonWordについてのみ"n"と返してほしいんです。
書いたプログラムは>>729から進歩してません。
0737nobodyさん2009/06/19(金) 18:48:16ID:???
>>736
> 書いたプログラムは>>729から進歩してません。

だから、そのスクリプト(プログラム)を見せろって
07387142009/06/19(金) 18:56:47ID:???
>>737

use utf8;
binmode STDIN, ":utf8";
binmode STDOUT, ":utf8";

use open IN => ":utf8";
use open OUT => ":utf8";

open(IN1, "<data_in.txt");
open(OUT1, ">data_out.txt");

while(my $line = <IN1>){
chomp $line;
if($line eq "NonWord"){
print OUT1 "n\n";
}else{
print OUT1 "m\n";
}
}

close(IN1);
close(OUT1);

これが全貌です。
やはり、生のデータの方を扱っても1行目のNonWordに対してmと出るだけです。
つまり出力はm一文字しか出てない状態です

0739nobodyさん2009/06/19(金) 18:59:34ID:???
アスキーファイルじゃないのかよ
まずUTF-8のBOM付きファイルかどうか確認しろよ
07407142009/06/19(金) 19:08:30ID:???
みなさん、本当にありがとうございました。
今ツレに言われたんですが
「その作業、エクセルでできんじゃね?」て言われて、やってみたらできちゃいました。
たくさん協力してもらったのに、ほんと、すいません。


0741nobodyさん2009/06/19(金) 19:10:25ID:???
全部ASCIIだからBOMが無ければutf8かどうかは関係ないな。
隠された部分が無ければの話だが。
0742nobodyさん2009/06/20(土) 04:13:04ID:???
このスレだけでも3人の質問者が IN1 と書いていて
全員初心者を自称しているわけだが(初心者質問スレだから当たり前ではあるが)、
すると恐らく、参考にした入門書・入門サイトも一緒なのだろう。
いったいどこが出自なんだろうな?
0743nobodyさん2009/06/20(土) 08:57:48ID:???
同一人物じゃねーの?
0744nobodyさん2009/06/20(土) 09:08:58ID:???
はじめは IN1 と OUT1 を open するところも書かないし
IN1 は5000行ばかしのファイルらしいしコードを見せたがらない
という入門サイトを参考にしてるんだろう
0745nobodyさん2009/06/20(土) 22:26:45ID:???
おなじ宿題だろ
0746nobodyさん2009/06/23(火) 11:24:34ID:???
>>738
それをコピペして動かしたけど、ちゃんと動くよ
まだ隠してるトコあんじゃね?
それかデータファイルそのものを、どこかにアップしてみてよ
データファイルを見ないと、もう解決できんよ
0747nobodyさん2009/06/24(水) 05:36:20ID:???
727で今日中にって言ってるだろ
もう終わった話なんだよ
落第すりゃいいのにね
0748nobodyさん2009/06/24(水) 09:31:28ID:???
宿題を2chで質問しちゃうような奴は、どの道向いてない
0749nobodyさん2009/06/24(水) 17:47:13ID:???
新しく環境を構築したんですけど、
以下のコードをApache2.2のlocalhostで実行すると
一度起動するたびに「てすと」と2回書き込みされてしまいます。
どうしてもコーディングにミスが見当たらないんですが
環境が悪いんでしょうか?
対処法ありましたら教えてください

#!/usr/bin/perl

use strict;
use encoding 'utf8',STDOUT=>'shift_jis';

open(ADD,">>",'./txt.txt') or die;
print ADD 'てすと'."\n";
close(ADD);
0750nobodyさん2009/06/24(水) 17:59:03ID:???
OSが壊れてるね
0751nobodyさん2009/06/24(水) 18:01:30ID:???
>open(ADD,">>",'./txt.txt') or die;
open(ADD,">./txt.txt") or die;

これでもだめ?
0752nobodyさん2009/06/24(水) 18:07:19ID:???
>>751
そうすると何度実行しても一行だけになります。
普通ですねw

ブラウザのキャッシュ消したり、プロクシ見直したりしてもだめでした。
httpd.confにも異常なしです。
最近デュアルディスプレイにしたんですけど関係ないですよねぇ
0753nobodyさん2009/06/24(水) 18:22:10ID:???
まずログ見ろよ
2回リクエストされてればブラウザが悪さしてる
そうやって可能性を推測していけ、サルじゃなければできる
0754nobodyさん2009/06/24(水) 18:30:03ID:???
標準出力に何も吐いてないからブラウザには500が返るよね
0755nobodyさん2009/06/24(水) 18:48:09ID:???
>>753
Apacheのアクセスログも2重になってましたorz
3種類のブラウザで試しましたが同じでした。
どこら辺が悪いかわかるでしょうか?

>>754
そこら辺は省略してますが問題ない内容です。
ヘッダと少しのテキストをprintしてます。
0756nobodyさん2009/06/24(水) 18:49:50ID:???
じゃあabで1リクエストしたらどうよ
0757nobodyさん2009/06/24(水) 19:02:18ID:???
>>756
ab -n 1 -c 1 http...
'ab'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。
o...rz

今更ですがerror.log見たら
utf8フラグをprintしてるとか書いてありました。
ダメなんですか
0758nobodyさん2009/06/24(水) 19:15:43ID:???
apache のディレクトリまで Path 通ってたっけ?

ab の Path をフルで指定しれ
0759nobodyさん2009/06/24(水) 19:16:47ID:???
とりあえず
use open ':encoding(utf8)';

lwp-requestはある?
バージョンが古いと別の名前だったような気がするけど。
lwp-request -USe http://localhost/
こんな感じで。
0760nobodyさん2009/06/24(水) 20:09:02ID:???
>>758
やってみたら理想通り動きました。

>>759
こちらも理想通り動きました。
それと、よくわかりませんが
200 ok
だそうです。

apacheとPerl,Ruby,PHP入ってたんですが一度全部消してみました。
で、同じバージョンで再インストールして
Perlの事だけ考えて設定してみましたが変化なしです。

何度もすいませんがどうすればいいんでしょうか?
0761nobodyさん2009/06/24(水) 20:37:38ID:???
>>760
レスポンスヘッダの時刻に注目して。オプション付けると出てくるから。
スクリプトに warn('hoehoe'); とか書いといて。実行される度にエラーログに載るから。
それと、apacheのアクセスログ。

どのリクエストが、どうスクリプトを動かして、どのレスポンス出してるのか、
タイムスタンプで照らし合わせて見て。
一致するならapacheに問題ないから。
0762nobodyさん2009/06/24(水) 20:39:58ID:???
解決しますた。
原因はその後のコードにありました。
全く関係ないと思ってたんですが
ヒアドキュメントで
print <<EOM;
ほにゃらら
<link rel="stylesheet" href="" type="text/css" />
ほげほげ
EOM

としてたんですが
上記のタグを削除したら直りました。
たぶんスタイルシートが読み込めなかったから
ブラウザが自動的にリロードしたんだとおもいます。
くだらないエラーですいません。ありがとうございました
0763nobodyさん2009/06/24(水) 21:01:10ID:???
後出しジャンケンうぜぇええええええええええええ
0764nobodyさん2009/06/24(水) 21:05:39ID:???
すこし慣れてくるとコツコツとデバッグしなくなるから困るw
0765nobodyさん2009/06/24(水) 21:21:36ID:???
www
0766nobodyさん2009/06/24(水) 22:00:29ID:???
ヘッダ情報は重要なんで、見られるツールを一つ用意しておくと便利だぁよ。

プロ仕様
IE,Firefox
Fiddler Web Debugger - A free web debugging tool
http://www.fiddler2.com/fiddler2/

Firefoxのみ簡単仕様
Live HTTP Headers :: Firefox Add-ons
https://addons.mozilla.org/ja/firefox/addon/3829

ニコニコなど趣味に(
Proxomitron-J
http://www.pluto.dti.ne.jp/~tengu/proxomitron/
0767nobodyさん2009/06/24(水) 23:00:29ID:???
>>766
サンクス!やっぱfirefoxはいいね
0768 ◆TWARamEjuA 2009/06/24(水) 23:31:37ID:????BRZ(10072)
Safariに入っているWeb インスペクタは重宝していますm(_ _)m
0769nobodyさん2009/06/25(木) 02:01:15ID:???
デバッグの時、HTTP::Proxyで、localhostに仮想プロ串立てて、
そこから全てのリクエスト(ヘッダやPOSTの中身、Javascript絡みの通信も)を
監視してるオレは、マイノリティなのかな・・・。
0770nobodyさん2009/06/25(木) 03:30:59ID:???
5.8の時はHTTP::Proxyを使うこともあった。
5.10以降、Windowsで使えるHTTP::Proxyが無いのが困り物。
CPANから拾ってもテストが通らないし。
0771nobodyさん2009/06/25(木) 09:04:35ID:???
wiresharkで通信全部見る。httpsには使えないが。
0772nobodyさん2009/06/25(木) 12:37:23ID:???
5.10って色々不便そうだな
6が出るまで5.8でいいわ
0773nobodyさん2009/06/25(木) 12:45:53ID:???
5.005のときも5.6のときもそんなことを思ったw
0774nobodyさん2009/06/25(木) 14:05:24ID:???
まぁライブラリ/モジュールの対応が遅れるのは仕方ないだろ。

ところで // ってどんなときに使うん?
0775nobodyさん2009/06/25(木) 14:38:37ID:???
my $d = $v; 但し$vの内容がundefなら$d = '' にしたい

my $d = $v || '';

$v = 0 でも$d = '' になっちゃうじゃん

my $d = $v // '';
0776nobodyさん2009/06/25(木) 15:32:19ID:???
質問です。
値をリファレンスにして、サブルーチンに渡す。
あるいはサブルーチンで処理したデータをリファレンスで受け取った後に、
そのリファレンスの値が参照できない・・・ということはありますか?
0777nobodyさん2009/06/25(木) 15:55:12ID:???
あったら大変じゃん
0778nobodyさん2009/06/25(木) 16:19:30ID:???
>>776
いまいち話が掴めないけど、
普通に使っていれば、無いんじゃないか。
0779nobodyさん2009/06/25(木) 20:28:45ID:???
内部コードをutf8で書きhtml出力をshiftjisで書いてるんですが、
フォームから「テストあいうえお日本語」等と送っても正常に処理出来るんですが
「テスト&」と送ると
Wide character in subroutine entry at C:/usr/lib/Encode.pm line 162
となりエラーになります。

「&」だけでは大丈夫なんですが「ト&」ではエラーになります。
デコード前に処理が必要なんでしょうか?
0780nobodyさん2009/06/25(木) 21:15:06ID:???
ソース無しにデバッグしろとな。
エスパーすると、decodeした文字列をもう一回decodeしてる。
0781nobodyさん2009/06/25(木) 21:59:58ID:???
>>780
見苦しいですが思いあたるとこはこの辺りです。
use Encode qw(from_to decode encode encode_utf8);
use open ':utf8';
use encoding 'utf8',STDOUT=>'shiftjis';

my %param = parse_form();
my $query;
if (exists $param{'query'}) {
$query = decode('shiftjis',$param{'query'});
#$query = $param{'query'};
}
0782nobodyさん2009/06/25(木) 22:01:15ID:???
sub parse_form {
my $buffer;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
} else {
$buffer = $ENV{'QUERY_STRING'};
}
my %param;
foreach (split(/&/,$buffer)) {
my ($name,$value) = split(/=/);
#form要素のname属性が/^[A-Za-z]+$/でなければ無視する
$name = uri_decode($name);
next unless $name =~ /^[A-Za-z]+$/;
$value = escape_string(uri_decode($value));
if (defined $param{$name}) {
my @values = sort((split(/\t/,$param{$name}),$value));
$param{$name} = join("\t",@values);
} else {
$param{$name} = $value;
}
}
0783nobodyさん2009/06/25(木) 22:03:33ID:???
sub uri_decode {
my $string = shift;
$string =~ tr/+/ /;
$string = encode_utf8($string);
$string =~ s/%([0-9A-Fa-f]{2})/pack("H2",$1)/eg;
return $string;
}
sub escape_string {
my $string = shift;
$string =~ s/&/\&\;/g;
$string =~ s/"/\"\;/g;
$string =~ s/$string =~ s/>/\>\;/g;
$string =~ s/\t/\ /g;
$string =~ s/\r\n/\n/g;
$string =~ s/\r/\n/g;
return $string;
}
return %param;
}
0784nobodyさん2009/06/25(木) 22:29:49ID:???
そんな適当なデコードするくらいならモジュール使ったほうがいい
0785nobodyさん2009/06/25(木) 22:39:23ID:???
>>784
ふだんはuse CGIしてるんですけど、
URIデコードの途中でutf8フラグを落とさないと
上手くいかなかったんで試行錯誤してます
具体的にやり方教えてもらえるならお願いします
0786nobodyさん2009/06/26(金) 00:38:52ID:???
use utf8;
use open ':utf8';
binmode(STDIN => ':raw');
binmode(STDOUT => ':encoding(Shift_JIS)');
use CGI qw(-utf8 :cgi);

my $cgi = CGI->new;
my $query = $cgi->param('query');
0787nobodyさん2009/06/26(金) 02:19:39ID:???
>>775
あぁなるほどね。
"0"も0も、||オペランドでは数値の0として評価されるから必要になるのか。
0788nobodyさん2009/06/26(金) 02:22:48ID:???
このノリでrubyやると躓くんだよな
0789nobodyさん2009/06/26(金) 08:18:46ID:???
>>786
おお!ありがとうございます。
と思ってprintしてみたらデコードされてなかったorz
もうやだ文字コードめんどくさい。
もうutf-8駄目な環境は無視していいのかな?
0790nobodyさん2009/06/26(金) 14:05:30ID:???
なるべくshiftjisで粘るのが吉
0791nobodyさん2009/06/26(金) 15:26:54ID:???
>>789
STDINがutf8で、STDOUTがShift_JISで、コードがutf8なんだよね?
デコードされてなかったってのは、\x{0081}とかで表示される?
うーん、分からん。

でも、CGI.pmとencodingの相性が最悪なのは分かった。
0792nobodyさん2009/06/26(金) 16:44:17ID:???
use encodingせずにCGI.pmのparamを自前でdecodeしてから
使うのが今のところ確実かな。
0793nobodyさん2009/06/26(金) 17:55:34ID:???
>>791
>デコード
例えば「テスト&」と送ると
\x{fffd}e\x{fffd}X\x{fffd}g&
となりutf8::is_utf8はtrueになります。

まだ勉強しなきゃいけない部分が多く出て来たんで
対処のしようが無いorz

>>792
CGI.pmはインスタンス作った時点でデコードされてるんではないんですか?
てことは、paramを自前でデコードしても2重デコードになったりしないんですよね?
あれ?俺なんか変?
0794nobodyさん2009/06/26(金) 18:07:24ID:???
ttp://blog.livedoor.jp/dankogai/archives/51227060.html
0795nobodyさん2009/06/26(金) 18:21:09ID:???
>>794
お勉強してきますw

いちおう全文ぅpしときます。
少なくともなにがしたいのかは分かると思います
お願いします
http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=2167
0796nobodyさん2009/06/26(金) 19:11:15ID:???
入力がShift_JISなのね。

use utf8;
use open ':utf8';
binmode(STDIN=>':raw');
binmode(STDOUT=>':encoding(Shift_JIS)');
use CGI qw(:cgi);

my $cgi = CGI->new;
my $query = decode 'Shift_JIS' => $cgi->param('query');
07977962009/06/26(金) 19:27:16ID:???
一応動くと思うけど、paramの返り値のundefチェック忘れてるので適宜入れておいてね。
ソース見て気になったけど、サブルーチン内でサブルーチンの定義はPerlではやめた方がいいよ。
0798nobodyさん2009/06/26(金) 19:38:40ID:???
>>796-797
ぅわぁぁぁぁ完璧です。
いままで何度も挫折したんですが初めて解決しました。
まじで感謝してもしきれないですw

>サブルーチン内でサブルーチン サブルーチンからサブルーチン呼ぶ場合はいつもそうしてました(汗
0799nobodyさん2009/06/30(火) 17:03:31ID:???
ローカルに保存したニコニコ動画のmp4をiPod用にエンコする操作の
スクリプトを書こうと思ったんですが,mp4に格納されている
動画(コーデックはh.264)のサイズ(幅×高さ)を取得する方法って
ありますか?

MP4::Infoでイケルかと思ったら,これは動画サイズを取得できない
みたいなんですよ・・
ttp://search.cpan.org/~jhar/MP4-Info-1.12/Info.pm
0800nobodyさん2009/06/30(火) 23:13:29ID:???
mplayer だかなんだかわすれたけど、パッケージマネージャーを見てれば発見できるよ
08017992009/07/01(水) 02:27:40ID:???
>>800さん
>mplayer
なるほど.一度外部のアプリを使って画像を生成して
それの大きさを取得するってことですかね?
ちょっとやってみます.
アドバイスありがとうございます.
パッケージマネージャーのほうはよくわかりませんでした.
0802nobodyさん2009/07/01(水) 10:56:47ID:???
会社に行ったらPCから書きまする
0803nobodyさん2009/07/01(水) 14:19:30ID:???
今は使ってないので、使い方は試行錯誤してもらうとして。
ppm から Audio-Play-MPlayer っていうパッケージを入れて、

実行する CGI/pl と同じディレクトリに MPlayer を置いてください。

使い方は、、、がんばれw




書いてて思ったけど、自分は system() で起動して情報を取得してた気がするw
08047992009/07/02(木) 23:42:04ID:???
>>802-803さん
継続してアドバイスありがとうございます。
自分でも色々試行錯誤した結果なんですが、
エンコで使うffmpegが入力する動画情報も返してくれることが
分かったので、そっちを使うことにしました。その結果、

my @out = `ffmpegのパス -i 動画ファイル名 2>&1`;
my ($width, $height);
foreach my $line(@out){
$line =~ /Stream .+ Video: .+ ([0-9]+)x([0-9]+), /;
if($1){
$width = $1;
$height = $2;
last;
}
}
print "$width x $height\n";

こんなかんじで取得することができました。
>>802-803さんや、見守って頂いたスレの皆様に感謝致します。
ありがとうございました。
0805nobodyさん2009/07/03(金) 13:19:59ID:???
ttp://search.cpan.org/search?query=ffmpeg
やっぱりあるのね。
0806nobodyさん2009/07/06(月) 17:16:31ID:???
Encode::Guessなんだけど、候補が複数あるときに
どれを採用すればいいのかって話は確立してる?

今のところ、すべての候補でdecodeして文字列長の短いものを採用しているんだけど
良い方法があるなら知りたい。
0807nobodyさん2009/07/06(月) 17:21:04ID:???
それが確立されてればとっくに文字コード誤判別問題は解決してる
0808nobodyさん2009/07/06(月) 17:41:03ID:???
それもそうか。
幸いにも>>806の方法でまだ文字化けには遭遇してないけど、もしバケたら諦めよう。
0809nobodyさん2009/07/06(月) 18:28:01ID:???
Guess で or って文字列が無ければ決め打ち
or って文字が入ってれば、最初に来たエンコードでやってみる

すごくあいまいだけど、それで済ましてる
0810nobodyさん2009/07/06(月) 18:49:46ID:???
それだけだとバケると思うけど。

use strict;
use Encode;
use Encode::Guess qw/euc-jp shiftjis/;

my @words = (
 "\xE3\x83\xAF\xE3\x83\xB3", # UTF-8 "ワン"
 "\xE6\x8E\x88\xE6\xA5\xAD", # UTF-8 "授業"
 "\xE7\x86\xB1\xE3\x81\x84", # UTF-8 "熱い"
);

for my $word (@words) {
 my $enc  = Encode::Guess->guess( $word );
 if( ref $enc ) {
  print $enc->name,"\n";
 } else {
  print $enc,"\n";
 }
}

結果は
shiftjis or utf8
shiftjis or utf8
utf8
0811nobodyさん2009/07/06(月) 19:50:17ID:???
形態素解析にかけてだな
0812nobodyさん2009/07/06(月) 20:21:17ID:???
それで?
0813nobodyさん2009/07/06(月) 21:26:40ID:???
形態素解析といえば、Yahoo! APIに丸投げする手があったか。

・・・コストたけえよ。
0814nobodyさん2009/07/11(土) 14:22:02ID:???
array、scalar両方をreturnすることのできる関数を使用するときに、
arrayを期待して関数を実行する一般的は方法はどのようなものでしょうか?

スカラーを期待するときは print scalar any_func();
とscalarを使えばいける用ですが、arrayを期待するやり方が分かりません。
0815nobodyさん2009/07/11(土) 14:27:11ID:???
例えば @{[ func()]}; とか?
要素だけ欲しいなら [ func()]->[0] とか使ってる
もうちょっといい方法があるかもしんないけど
0816nobodyさん2009/07/11(土) 14:43:15ID:???
印字ならprint any_func();でいける

代入なら($x)= any_func();でいける
0817nobodyさん2009/07/11(土) 14:57:08ID:???
>>515-516
即レスありがとうございます。
any_func() のなかでwantarrayを使用しているのですが、

sub any_func {
my @a = (1, 2, 3);
my $s = 6;
return wantarry ? @a : $s;
}

print文のなかで使用するにはやはり一旦変数にとってからprintでしょうか。
print文のなかで直接any_func()を使用するとscalarのreturnが表示されて困ってました。
0818nobodyさん2009/07/11(土) 14:58:10ID:???
× >>515-516
>>815-816
0819nobodyさん2009/07/11(土) 16:34:37ID:???
use strict;
use warnings;

sub any_func {
my @a = (1, 2, 3);
my $s = 6;
return wantarray ? @a : $s;
}

print any_func();

wantarryをwantarrayに直しただけで、ちゃんと123が表示されるよ?
■ このスレッドは過去ログ倉庫に格納されています