[EMAIL PROTECTED] (Daniel Kidger) wrote on 13 Nov 2001:
>
> I have a pattern like
> $hosts = "fred[1,3-7,9-22]"
>
> Is there a simple way to generate an expanded list like:
> fred1 fred3 fred4 fred5 ...
*If* you can trust your input, here's a quick way:
use strict;
use warnings;
my $str = 'fred[1,3-7,9-22]';
if ( $str =~ /\[([^]]+)]/ ) {
my $numtext = $1;
$numtext =~ s/-/../g;
print "fred$_\n" for eval $numtext;
}
__END__
The following is safer, although I still don't guarantee I haven't
overlooked something.
use strict;
use warnings;
my $str = q{fred[,1,system "arbitary command",3--hi--7,9-\\ 22,--,99-
---101----200, 45-40,,,-]};
# assuming all numbers are positive integers
if ( $str =~ /\[([^]]+)]/ ) {
my $number_text = $1;
$number_text =~ tr/0-9,\-//cd; # delete unexpected characters
$number_text =~ s/,+/,/g; # delete extra commas
$number_text =~ s/-+/-/g; # delete extra dashes
$number_text =~ s/^[,-]+//; # delete commas and dashes at string start
$number_text =~ s/[,-]+$//; # delete commas and dashes at string end
$number_text =~ s/-*,-*/,/g;# no dashes next to commas
my @range_list = split /,/, $number_text;
for my $range (@range_list) {
# plain integer? print it and go to the next one
print("fred$range\n"), next if $range =~ /^\d+$/;
# skip if it isn't number-dash-number
next if $range !~ /^(\d+)-(\d+)$/;
my ($start, $end) = ($1, $2);
if ($start <= $end) {
print "fred$_\n" for $start .. $end;
}
}
}
__END__
--
David Wall
[EMAIL PROTECTED]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]