作者: 藤岡和夫
日時: 2010/2/28(14:33)
On Thu, 25 Feb 2010 02:34:56 +0900
INABA HITOSHI <hinaba@...> さんwrote:

> use して使っているのは、
> (1) strict
> (2) vars
> (3) Fcntl
> (4) Symbol
> (5) Carp
> (6) FindBin
> です。これらがさらに use しているモジュールがあります。全部なくすのは結構
> 難しいです(無理かもしれません)。ということは @nifty で使うのは無理っぽい。

 @niftyやLaCoocanなどのサーバーを使うのに制約が出てくるのは仕方がないで
す。気にされる必要はありません。それはモジュール側の責任ではなく、使う側
の問題です。

 それはともかく、次のようなスクリプトを書いてテストしています。ZedでTAG
実行をするためのものです。エディタ編集ウインドウ上で、

isbn978-4-15-209089-8

のようなISBN番号の文字列パターンを含む行でCtrl+クリックするとパターン文
字列を引数としてスクリプトを実行します。

Sjis.pmやjacode.plを使う場面としてはまったく適切な例とは言えませんが。

スクリプトを試すためには、Amazon Access Keyをセットする必要があります。

下記のスクリプトを実行すると、次のようなエラーになります。

C:\Perl5.10\bin\perl.exe C:\Scripts\zed046\macro\exec\menu\edit\isbn2sjishtml.pl "isbn978-4-15-209089-8"

Name "Esjis::isbn978-4-15-209089-8" used only once: possible typo at C:/Perl5.10/lib/Symbol.pm line 135.
Undefined subroutine &jcode::f called at C:/Perl5.10/site/lib/jacode.pl line 587.

コメントしているutf-8出力用のように書けば問題なく動作します。上のはZedの
サブウインドウ上の出力です。

コマンドプロンプトでは、

sjis出力用にすれば、同様な出力で止まります。

-----^
C:\Scripts\zed046\macro\exec\menu\edit>perl isbn2sjishtml.pl "isbn978-4-15-20908
9-8"
Name "Esjis::isbn978-4-15-209089-8" used only once: possible typo at C:/Perl5.10
/lib/Symbol.pm line 135.
Undefined subroutine &jcode::f called at C:/Perl5.10/site/lib/jacode.pl line 587
.
-----$

utf8出力用に変更すると、次のようなエラーになりますが目的は達成されます。
下記のエラーメッセージはZedのサブウインドウには出力されませんが^^;)

-----^
C:\Scripts\zed046\macro\exec\menu\edit>perl isbn2sjishtml.pl "isbn978-4-15-20908
9-8"
Name "Esjis::isbn978-4-15-209089-8" used only once: possible typo at C:/Perl5.10
/lib/Symbol.pm line 135.
Wide character in print at isbn2sjishtml.pl.e line 65.
Wide character in print at isbn2sjishtml.pl.e line 65.
Wide character in print at isbn2sjishtml.pl.e line 65.
-----$

次のスクリプトはsjis出力用にコメントしている。

-----^
#!/Perl5.10/bin/perl.exe
# Title = ISBN2SJISHTML
# Input

# Copyright 2009,2010 jscripter(jscripter9@...)

use Net::Amazon;
use Sjis;
require 'jacode.pl';
$|=1;

my $isbn = "";
if($ARGV[0]){
	($isbn = $ARGV[0]) =~ s/^i*s*bn:* *([\d\-]+)$/$1/i;
}else{
while(<>){
	if(index($_, "\x1A") > -1){
		last;
	}
	chomp;
	($isbn = $_) =~ s/^i*s*bn:* *([\d\-]+)$/$1/i;
}
}
my($isbn13, $localenum) = &isbn10to13($isbn);
my $locale = "";
if($localenum == 0){
	$locale = 'us';
}elsif($localenum == 1){
	$locale = 'uk';
}elsif($localenum == 2){
	$locale = 'fr';
}elsif($localenum == 3){
	$locale = 'de';
}elsif($localenum == 4){
	$locale = 'jp';
}

open(OUT,"> isbn${isbn}.html");
print OUT "<html><head>\n";
print OUT "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Shift_JIS\">\n";
#print OUT "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n";
print OUT "<body>\n";

# Set your Amazon Access Key ###
my $ua = Net::Amazon->new(token => 'Your_Amazon_Access_Key',
			secret_key => 'Your_Amazon_Secret_Access_Key',
			locale => $locale);
###

# Get a request object
my $response = $ua->search(isbn => $isbn13);

if($response->is_success()) {
	for ($response->properties){
		print OUT "<img src=\"", &jcode'sjis($_->ImageUrlMedium(),'utf8'),
		"\" align=LEFT hspace=20>",
		&jcode'sjis($_->authors, 'utf8'), "著「",
		&jcode'sjis($_->title(),'utf8'), "」(",
		&jcode'sjis($_->publisher(), 'utf8'), ", ",
		&jcode'sjis($_->year(), 'utf8'),
		"年)<br clear=ALL>";
#		print OUT "<img src=\"", $_->ImageUrlMedium(),
#		"\" align=LEFT hspace=20>",
#		$_->authors, &jcode'utf8("著「", 'sjis'),
#		$_->title(), &jcode'utf8("」(", 'sjis'),
#		$_->publisher(), ", ", $_->year(),
#		&jcode'utf8("年)<br clear=ALL>", 'sjis');
	}
} else {
    print "<p>Error: ", $response->message(), "</p>\n";
}

print OUT "</body></html>\n";
close(OUT);

system("start isbn${isbn}.html");

sub isbn10to13{
	my($isbn10) = @_;
	my $isbn13 = "";
	my $localenum = 0;
	$isbn10 =~ s/-//g;
	if($isbn10 =~ /^(\d{9}).$/){
		$isbn13 = "978" . $1;
		$isbn13 =~ /^(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)$/;
		$localenum = $4;
		$e = $2 + $4 + $6 + $8 + $10 + $12;
		$o = $1 + $3 + $5 + $7 + $9 + $11;
		($f = $e * 3 + $o) =~ s/^\d*(\d)$/$1/;
		if($f == 0){
			$isbn13 .= "0";
		}else{
			$isbn13  .= 10 - $f;
		}
	}else{
		$isbn13 = $isbn10;
		$localenum = (split(//, $isbn13))[3];
	}
	return $isbn13, $localenum;
}
-----$

TSNETスクリプト通信ネタはこれ関係^^;)

藤岡 和夫
kazuf@...
日曜プログラマのひとりごと http://homepage1.nifty.com/kazuf/renewal.html