9.7 KiB
9.7 KiB
title | author | date | wordtwit_post_info | categories | |||
---|---|---|---|---|---|---|---|
isbn13 –> isbn10 | kazu634 | 2008-07-02 |
|
|
本とかを買ってきて、
- isbn13で検索
- 本の題名で検索してAmazonにたどり着く
- asinをコピペして、ブログ記事を書く
というこの一連の流れがうざったくなってきたので、perlでisbn13をisbn10に変換するスクリプトを書いてみた。スクリプトの引数チェックが甘いけれど、まぁ引数は数字の羅列で先頭13桁目までしか見ないのは仕様ということで(..;)
use strict; use warnings; # ================== # === 変数の宣言 === # ================== # isbn10を格納するための配列 my @isbn10; my $isbn13; # ==================== # === 起動時の処理 === # ==================== # スクリプトに引数が設定されてなければ終了 exit if (@ARGV == ); # スクリプトの引数を代入する my $chk = &chk_arg($ARGV[]); # 引数のチェック exit if ($chk == -1); $isbn13 = $ARGV[]; # ================ # === 処理開始 === # ================ # 数字を一つずつ配列に格納 my @temp = split(//, $isbn13); # check digit以外の部分が完成 for (my $i = 3; $i < 12; $i++) { push(@isbn10, $temp[$i]) } # check digitの計算 my $c_digit = &calc_c_digit(@isbn10); # check digitを配列に格納 push(@isbn10, $c_digit); # isbn10を表示 print(@isbn10, "\n"); # ================ # === 処理終了 === # ================ exit; # ================================== # ========== サブルーチン ========== # ================================== # ================================ # === チェックディジットの計算 === # ================================ # 戻り値: チェックディジット sub calc_c_digit { # check digitを計算するためのisbn my @tmp_isbn9 = @_; # 計算用 my $temp; for (my $i = ; $i < @tmp_isbn9; $i++) { $temp += $tmp_isbn9[$i] * (10 - $i); } $temp = int($temp % 11); $temp = 11 - $temp; if ($temp == 10) { return ("X"); } else { return $temp; } } # ================================ # === スクリプトの引数チェック === # ================================ # 0 : 正常な引数 # -1 : 異常な引数 sub chk_arg { my @tmp = @_; foreach my $i (@tmp) { return (-1) if ($i =~ /[a-zA-Z]/); } return(); }