--- title: 'isbn13 –> isbn10' author: kazu634 date: 2008-07-02 url: /2008/07/02/isbn13-isbn10/ wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4107;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl - Programming ---

 本とかを買ってきて、

  1. isbn13で検索
  2. 本の題名で検索してAmazonにたどり着く
  3. 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();
}

新版Perl言語プログラミングレッスン入門編

新版Perl言語プログラミングレッスン入門編