URL展開

[]http://www.xxxxx.com/[001-100].zip[]的な記法でURLを展開できると楽ができそうな気がしたので、(その手のツールは星の数ほどあるにも拘らず)Perlで書いてみた。

#!/usr/bin/perl

use strict;
use warnings;

while (<>) {
	chomp;
	my @num = ();
	my $chk = 0;
	my $prf = $_;
	my $mid = $_;
	my $suf = $_;
	my $cnt = 0;
	my $end = 0;
	my $zf_flag = 0;
	my $zf_work = 0;
	my $zf_zero = "";
	my $err_msg = "連番URLが取得できません.\n";

	if($mid =~ /\[.+?\]/) {
		$mid = $&;
		$mid = substr($mid,1,length($mid)-2);
		@num = split(/-/,$mid);
		$chk = @num;
		
		if($chk < 2) {
			die($err_msg);
		} else {
			$cnt = shift(@num);
			$end = shift(@num);
		}
		
		unless($cnt =~ /^\d*$/) {
			die($err_msg);
		}
		
		unless($end =~ /^\d*$/) {
			die($err_msg);
		}
		
	} else {
		die($err_msg);
	}

	if($prf =~ /.+?\[/) {
		$prf = $&;
		$prf = substr($prf,0,length($prf)-1);
	} else {
		die($err_msg);
	}

	if($suf =~ /\].*$/) {
		$suf = $&;
		$suf = substr($suf,1,length($suf)-1);
	} else {
		die($err_msg);
	}

	if(length($cnt) > 1) {
		if(substr($cnt,0,1) eq "0") {
			$zf_flag = 1;
			$cnt =~ s/0*//g;
			if(length($cnt) == 0) {
				$cnt = 0;
			}
		}
	}
	
	if($zf_flag == 0) {
		while($cnt <= $end) {
			print $prf . $cnt . $suf ."\n";
			$cnt++;
		}
	} else {
		while($cnt <= $end) {
			while($zf_work < length($end)-length($cnt)) {
				$zf_zero = $zf_zero . "0";
				$zf_work++;
			}
			print $prf . $zf_zero . $cnt . $suf . "\n";
			$cnt++;
			$zf_work = 0;
			$zf_zero = "";
		}
	}
}

やはり自分の欲しいものを作るのは楽しい(´ω`)