スクリプト(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__
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 $!;
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でした。
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 などではレキシカルスコープにならないため)
とても良く分かりました。