--- 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 ---
本とかを買ってきて、
というこの一連の流れがうざったくなってきたので、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(); }