下記perlスクリプトの、入力(ホームページ取得)と、テキスト出力(text.txt)を確実に、SHIFT_JISに指定したいのですがどの様にすれば良いでしょうか?


スクリプト(test.pl)の記述はUTF-8。
例になるURL('http://**************************')は常に、SHIFT_JISなので読み込みミスをしない様、SHIFT_JISを指定したい。
また、確実に、SHIFT_JISで保存を行いたい。
この2つの条件を満たすperlのスクリプトを教えてください。
宜しくお願い致します。

----test.pl------
#!/usr/local/bin/perl

$URL = 'http://**************************';
use LWP::UserAgent;
use HTTP::Request;
use HTTP::Response;
my $proxy = new LWP::UserAgent;
$proxy->agent('ua');
$proxy->timeout(60);
my $req = HTTP::Request->new('GET' => $URL);
my $res = $proxy->request($req);
my $content = $res->content;

#プログラミングをprogrammingに置換
$str = 'プログラミング';
use Encode qw(from_to);
from_to($str,"utf8","SHIFT_JIS"); #UTF8に変換

$content =~ s/$str/programming/g;

open(F,">text.txt");
print F $content;
close(F);

__END__

回答の条件
  • 1人2回まで
  • 登録:2009/06/10 00:34:07
  • 終了:2009/06/10 10:14:58

ベストアンサー

id:Craftworks No.2

Craftworks回答回数20ベストアンサー獲得回数62009/06/10 02:00:37

ポイント60pt

http://blog.livedoor.jp/dankogai/archives/51221731.html

以下のソースは utf8 で保存

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use LWP::UserAgent;
use Path::Class;

my $url = shift;
my $str = 'プログラミング';
my $ua = LWP::UserAgent->new;
my $res = $ua->get($url);
my $content = $res->decoded_content; # or Encode::decode('sjis', $res->content);

$content =~ s/$str/programming/g;
$content = Encode::encode('sjis', $content);

my $file = Path::Class::File->new('text.txt');
my $fh = $file->openw;
print $fh $content;
$fh->close;

decoded_content() は文字化けする場合があるので、content() を使って明示的に Encode::decode() で変換した方が良さそうですね。

http://blog.livedoor.jp/sasata299/archives/51212133.html

Path::Class が使えない環境なら open は3引数で使いましょう。

open my $fh, '>', 'text.txt' or die $!;
id:TREEG

回答いただきありがとうございました。

これで安定動作しそうです。

>Path::Class が使えない環境なら open は3引数で使いましょう。

これは何故でしょうか?

補足いただけると幸いです。

2009/06/10 10:14:03

その他の回答(1件)

id:haruo-31 No.1

haruo-31回答回数80ベストアンサー獲得回数102009/06/10 00:50:19

ポイント10pt

http://www.namazu.org/~tsuchiya/perl/perl-5.8.html

ここの上から20%位行ったところの記載に習って書くと、こんな感じですかね。

use utf8;
open(F, ">somewhat.txt") or die $!;
binmode F, ":encoding(sjis)";

print F "sjisになってるはずな文字列";

手元のUTF8なLinuxで確認した分ではちゃんとSHIFTJISでした。

id:TREEG

回答いただきありがとうございます。

この質問をさせていただいたのは、

use LWPを使い何度もホームページをダウンロードしますと、時々、間違いなく、SHIFT_JISのページにも関わらず、他の文字コードで保存されます。

つまりこれは、ダウンロード時、SHIFT_JIS以外に誤認したか、書き込み時(text.txt)、SHIFT_JISで保存されなかったかが原因だと思います。

そこで、入力、出力、どちらも、SHIFT_JISで行いたいと思っています。

また、当方の力不足により、勘違いが発生すると二度手間になりますので、お手数ですが回答いただく際は、コードの一部ではなく、現在のコードを書き変えての回答を宜しくお願い致します。

2009/06/10 01:10:45
id:Craftworks No.2

Craftworks回答回数20ベストアンサー獲得回数62009/06/10 02:00:37ここでベストアンサー

ポイント60pt

http://blog.livedoor.jp/dankogai/archives/51221731.html

以下のソースは utf8 で保存

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
use LWP::UserAgent;
use Path::Class;

my $url = shift;
my $str = 'プログラミング';
my $ua = LWP::UserAgent->new;
my $res = $ua->get($url);
my $content = $res->decoded_content; # or Encode::decode('sjis', $res->content);

$content =~ s/$str/programming/g;
$content = Encode::encode('sjis', $content);

my $file = Path::Class::File->new('text.txt');
my $fh = $file->openw;
print $fh $content;
$fh->close;

decoded_content() は文字化けする場合があるので、content() を使って明示的に Encode::decode() で変換した方が良さそうですね。

http://blog.livedoor.jp/sasata299/archives/51212133.html

Path::Class が使えない環境なら open は3引数で使いましょう。

open my $fh, '>', 'text.txt' or die $!;
id:TREEG

回答いただきありがとうございました。

これで安定動作しそうです。

>Path::Class が使えない環境なら open は3引数で使いましょう。

これは何故でしょうか?

補足いただけると幸いです。

2009/06/10 10:14:03
  • id:Craftworks
    詳しくはマニュアルなどに書いてあります。

    perldoc -f open

    和訳(ページの真ん中より上寄り)
    http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod

    ラクダ本
    http://books.google.co.jp/books?id=6rNpvD--bBcC&pg=PA888&lpg=PA888&dq=perl+open+3%E5%BC%95%E6%95%B0&source=bl&ots=LlQKjUhvSE&sig=P1N5txZRqS9WQKYfQp-XA8k96uU&hl=ja&ei=jxMvSrG2EJGNkAXhuID_Dg&sa=X&oi=book_result&ct=result&resnum=2#PPA887,M1

    オープン対象のファイル名にリテラルを使う場合は良いですが、ユーザー入力値のスカラーを使う場合に差が出てきます。
    後はファイル名にスペースが入ってる場合など。

    あとファイルハンドルも my したスカラーを使うほうが良いです。(F などではレキシカルスコープにならないため)
  • id:TREEG
    非常に丁寧なコメント頂きありがとうございます。
    とても良く分かりました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません