#! /usr/local/bin/perl ## ## 文字配列 @A, @B のマッチしない箇所だけを取り出して出力 ## @A = split(/ +/, '1 2 3 4 5 this is a pen 6 7 8 9'); @B = split(/ +/, '1 2 3 4 5 this was a pencil 6 7 8 9'); $Xmae = &proc_mae(*A, *B, 0); $Xato = &proc_ato(*A, *B, 0); print ">>>Match string:: mae:$Xmae and ato:$Xato\n"; &Xprint($Xmae,$Xato, *A, *B); exit; ## ## sub Xprint($a,$b, *A,*B,):: ## @A,@B を対象として、前から $a 個、後ろから $b 個の要素を ## 取り除いた文字列を出力 ## sub Xprint { local($a,$b, *Aa, *Bb) = @_; local(@aa) = @Aa; local(@bb) = @Bb; while(0 < $a) { shift @aa; shift @bb; $a--; } while(0 < $b) { pop @aa; pop @bb; $b--; } print join(' ', @aa) . "\n"; print join(' ', @bb) . "\n"; } ## ## proc_mae:: ## 先頭からどこまでマッチするかをチェック ## sub proc_mae { local(*Aa,*Bb, $num) = @_; ## このへんはちょっと汚い (-_-) local(@aa) = @Aa; local(@bb) = @Bb; ## 終了条件のチェック if($#aa < 0 || $#bb < 0) { return undef; } local($a) = shift(@aa); local($b) = shift(@bb); if(0 == &char_compare($a,$b)) { return &proc_mae(*aa,*bb, $num+1); # 再帰させる } else { return $num; } } ## ## proc_ato:: ## 末尾からどこまでマッチするかをチェック ## sub proc_ato { local(*Aa,*Bb, $num) = @_; ## このへんはちょっと汚い (-_-) local(@aa) = @Aa; local(@bb) = @Bb; ## 終了条件のチェック if($#aa < 0 || $#bb < 0) { return undef; } local($a) = pop(@aa); local($b) = pop(@bb); if(0 == &char_compare($a,$b)) { return &proc_ato(*aa,*bb, $num+1); # 再帰させる } else { return $num; } } ## ## sub char_compare:: ## 与えられた2つの文字列が同一ならば 0 を返す ## sub char_compare { local($za,$zb) = @_; if($za eq $zb) { return 0; } return 1; }