中村 のりつぐ です。
In article <20021115203106M.nnakamur@...>
Noritsugu Nakamura <nnakamur@...> wrote:
> > 最近ちょっとした用事で必要があって,
> >
> > 1,2,3,5,7,8,10,12,14,15,16,17
> >
> > の様なソート済番号のリストを,
> >
> > 1-3,5,7-8,10,12,14-17
> >
> > の様な表現に直すスクリプトを Perl でつくりました.
>
> 数ヵ月前に欲しかった (^_^;
> # ありそうで見つからなかったので自分で作った
> # (会社に置いてある)
そのとき作ったもの + ちょっと変更
もともと、最大数が決まっていて、
# 3 --> 1,2,4-26
# 2 --> 1,3-26
# 2, 3, 4 --> 1,5-26
という仕様で作っていたので色々変かも。
# という前に正しいかどうかもあやしい…。
#!/usr/bin/env perl
$max_phase = 26;
##### ##### ##### #####
#
# 3 --> 1,2,4-26
# 2 --> 1,3-26
# 2, 3, 4 --> 1,5-26
#
#
sub format_range {
# 数字の配列を仮定
my(@ok_phase) = @_;
my($phase, %ok_phase);
my($ret_val, $last_phase);
foreach $phase (@ok_phase) {
$ok_phase{$phase} = 1;
}
# 範囲文字列の作成
# 最初の OK phase を取得
$last_phase = 0;
foreach $phase (1..$max_phase) {
if (exists($ok_phase{$phase})) {
$ret_val = "$phase";
$last_phase = $phase;
last;
}
}
#return "x" if ($last_phase == 0);
return () if ($last_phase == 0);
# 残りの OK phase を処理
foreach $phase (2..$max_phase) {
next if (!exists($ok_phase{$phase}));
next if ($phase == $last_phase);
# 前の数字が存在しない場合
if (!exists($ok_phase{$phase - 1})) {
$ret_val .= ",$phase";
$last_phase = $phase;
} else {
# 後の数字が存在しない場合
if (!exists($ok_phase{$phase + 1})) {
if ($phase - $last_phase > 1) {
$ret_val .= "-$phase";
} else {
$ret_val .= ",$phase";
}
$last_phase = $phase;
}
}
}
return $ret_val;
}
print format_range(1,2,4,5,6,7,8,9), "\n";
print format_range(1,3,4,5,6,7,8,9), "\n";
print format_range(1,5,6,7,8,9), "\n";
中村 典嗣 E-mail: nnakamur@...