■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

連番展開スクリプト(ruby版ver.2.1)

1. デクリメント動作時にはend側の桁数に合わせるようにした
2. 08,09を指定した際、evalに8進数だと解釈さ1れてエラーとなる問題の回避

2.のevalの8進数解釈の回避方法ってto_i.to_s以外ちゃんとしたのないのかなぁ…


#!/usr/bin/env ruby
###############################################
# expand serial number                        #
# syntax  : foo[nStart-nEnd][...]             #
# example : before                            #
#             0: foo[0-1][3-2]bar[1+\2][\1-1] #
#           after                             #
#             0: foo03bar4-1                  #
#             1: foo02bar3-1                  #
#             2: foo13bar40                   #
#             3: foo12bar30                   #
###############################################

####### SUB FUNCTIONS
### TO_S UNDER HEX
def to_hs(sFoo, isHex)
    return sprintf(isHex == 2 ? "%X" : isHex == 1 ? "%x" : "%d", sFoo)
end
### DIGIT ALIGNMENT
def aligndigit(sFoo, nLen)
    return sFoo = "0" * [nLen - sFoo.length, 0].max + sFoo
end
### DECREMENT INDEX OF BACK-REFERENCE
def decrefindex(sFoo)
  if (sFoo =~ /(.*?\[.*?\\)(\d)(.*?\].*)/)
    return $1 + ($2.to_i-1).to_s + decrefindex($3)
  end
  return sFoo
end
### SUBSTITUTE BACK-REFERENCE "\1"
def substbackref(sFoo, sBar, isHex)
  if (sFoo =~ /.*\[(.*?)\\1(.*?)\]/)
    sEvl = aligndigit(to_hs(eval($1 + (isHex != 0 ? "0x" + sBar : sBar.to_i.to_s) + $2), isHex), sBar.length)
    substbackref(sFoo.gsub!(/\[#{Regexp.escape($1 + '\1' + $2)}\]/, sEvl), sBar, isHex)
  end
  return decrefindex(sFoo)
end
### SERIAL NUMBER EXPANTION
def expand(sFoo)
  if (sFoo =~ /(.*?)\[\s*((?:0[xX])?[0-9a-fA-F]+)\s*-\s*((?:0[xX])?[0-9a-fA-F]+)\s*\](.*)/)
    sPre   = $1
    nStart = eval($2.to_i.to_s)
    nEnd   = eval($3.to_i.to_s)
    sSuf   = $4
    # increment/decrement
    nStep = nStart < nEnd ? 1 : -1
    nLen  = nStart < nEnd ? $2.length : $3.length

    if ($2[0..1] == "0X" && $3[0..1] == "0X")
      isHex = 2 
    elsif ($2[0..1] == "0x" && $3[0..1] == "0x")
      isHex = 1 
    else
      isHex = 0
    end
    nStart.step(nEnd, nStep){ |i|
      sAligned = aligndigit(to_hs(i, isHex), isHex != 0 ? nLen - 2 : nLen)
      expand(substbackref(sPre + sAligned + sSuf, sAligned, isHex))
    }
  else
    puts(sFoo)
  end
end

####### MAIN
ARGF.each_line{ |line| expand(line) }

# vim: expandtab ts=2 sw=2

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2010/07/31(土) 19:50:19|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<連番展開スクリプト(ruby版ver.2.2) | ホーム | 連番展開スクリプト(ruby版ver.2)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/421-e1986e89
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

07 | 2017/08 | 09
Sun Mon Tue Wed Thu Fri Sat
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。