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

スポンサーサイト

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

連番展開スクリプト(perl版)

連番展開Vimスクリプトを以前書きましたが、perlで書き直してみました。
勉強するって程じゃないけど、ちょっと位使えるといいなぁと思って、時々触れてます。

Vimスクリプト版との違いは後方参照に対応しているところです。
スクリプト自体にもコメントで書いてますが、
foo[0-1][3-2]bar[\2][\1]

foo03bar30
foo02bar20
foo13bar31
foo12bar21
と展開されます。
あーあと、桁数をそろえるようにしました。
foo[07-10]

foo07
foo08
foo09
foo10
となります。
例によって醜悪ソースですが、使い勝手としてはいいんじゃないかな?
後方参照とか便利だと思うので、アイディアだけでもパクってくださいなw

_vimrcに
command! -range ExpandSerialNumber <line1>,<line2>!perl C:\bin\runtime\ExpandSerialNumber.pl
とでも書いて下さい

ということで以下スクリプト本文

#!/bin/perl
# vim: expandtab ts=2 sw=2
use strict;
use warnings;

###################################
# expand serial number
# syntax  : foo[nStart-nEnd][...]
# example : before
#             0: foo[0-1][3-2]bar[\2][\1]
#           after
#             0: foo03bar30
#             1: foo02bar20
#             2: foo13bar31
#             3: foo12bar21
###################################

open(FH, "-");
my @args = <FH>;
close(FH);

my $pattern = '(.*?)\[(\d+)\-(\d+)\](.*\n)';

foreach my $arg (@args){
  if ($arg =~ /$pattern/){
    my $head  = $1;
    my $start = $2;
    my $end   = $3;
    my $tail  = $4;

    # increment/decrement direction
    my $direct = 0 < ($end - $start) ? 1 : -1;

    # align digit. ex) [01-99]
    my $digit = length($direct == 1 ? $start : $end);

    # expand numbers
    while (0 <= (($end - $start) * $direct)){
      my $line = $head . $start . $tail;

      # replace back reference
      $line =~ s/\[\\1\]/$start/g;
      #get next num
      my @backref;
      push(@backref, $line =~ /\[\\(\d+)\]/g);
      # sort and decrement
      foreach my $backref (sort {$a <=> $b} @backref){
        my $brd = $backref - 1;
        $line =~ s/(\[\\)$backref(\])/$1$brd$2/g;
      }

      # if find pattern from expanded string,
      if ($line =~ /$pattern/){
        # re-registrate to stack.
        push(@args, $line);
      }
      else {
        # remove unnecessary back reference
        $line =~ s/\[\\(\d+)\]//g;
        print $line;
      }
      $start += $direct;
      # align digit. ex) [01-99]
      if (length($start) < $digit){
        $start = sprintf "%s%s", "0"x($digit - length($start)), $start;
      }
    }
  }
  else{
    print $arg;
  }
}

テーマ:雑記 - ジャンル:コンピュータ

  1. 2008/02/11(月) 02:04:38|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
<<これ良くない? | ホーム | ドラえも~~~~ん>>

コメント

コメントの投稿


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

トラックバック

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

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

09 | 2017/10 | 11
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。