# =============================================================== package numarray; # =============================================================== # num-array # =============================================================== # # $za = "1 2 4 5 6 7 12 14" とかいう数字列があったとする。 # $zb = &numarray'pack($za); $zb => "1-2 4-7 12 14" # $zc = &numarray'items($zb); $zc => 8 # $zd = $numarray'pickup($zb,4); $zd => 5 # =============================================================== # # 指定された $num 番目の数字を返す # sub pickup { local($array,$num) = @_; local($i,$n); $array =~ s/^[ \t\r\n]*//; $array =~ s/[ \t\r\n]*$//; $array =~ s/[^ \t0-9\-]+//g; foreach $i ( split(/[ \t]+/, $array) ) { if($i !~ /\-/) { $n++; if($n == $num) { return $i; } } else { $i =~ /\-/; local($i1,$i2) = ( $`, $', ); while($i1 <= $i2) { $n++; if($n == $num) { return $i1; } $i1++; } } } return -1; } # # 数字列の要素数を返す # sub items { local($array) = @_; local($i,$n); $array =~ s/^[ \t\r\n]*//; $array =~ s/[ \t\r\n]*$//; $array =~ s/[^ \t0-9\-]+//g; foreach $i ( split(/[ \t]+/, $array) ) { if($i !~ /\-/) { $n++; } else { $i =~ /\-/; $n += $' - $` + 1; } } return $n; } # # 与えられた数字列を packing する # sub pack { local($nums, $maxlen) = @_; $nums =~ s/[ \t]*$//; local($za); local($lst) = ( '*', ); foreach $n (split(/[ \t]+/,$nums)) { if($lst ne '*') { if(($lst+1) != $n) { $za .= ' '; } else { $za .= '-'; } } $za .= $n; $lst = $n; } $za =~ s/\-[0-9\-]+\-/-/g; while($maxlen < length($za)) { $za =~ s/[ \t]+[^ \t]+$//; } return $za; } sub test { $| = 1; print ">"; while(<>) { s/[ \t\r\n]*$//; last if (/^$/); $z = &pack($_,1000); $zn = &items($z); $zp = &pickup($z,5); print "$z ($zn,$zp)\n"; print ">"; } } 1;