以前、ご質問させていただき、ご回答をいただいたのですが、
以前、ご質問させていただき、ご回答をいただいたのですが、
'server0[123]', 'client0[1-35-7]', 'client0[13-69]', 'client[1-3][0-9]'
の文字判定をお聞きし、自分なりにサブルーチン化して対応いたしましたが、
このたび
'server0[1-3]0','server0[1-3]2','client0[a-z1]',client[a-c][12]
等の文字列も判定する必要がでてきました。
sub host{
my @reg_str = @_;
my (@work, @result);
foreach my $reg_str (@reg_str) {
if ($reg_str = ~/\[/ ){
my $head = substr($reg_str, 0, index($reg_str, '['));
my @num = map { s/(\d)-(\d)/join('', $1 .. $2)/eg; [split //] } $reg_str =~ /\[([\d-]+)\]/g;
@ref_result = ();
@ref_result = comb(@num);
print join(',', map { $head . $_ } @result), "\n\n";
}else{
print "$reg_str\n";
}
sub comb {
my $ref = shift;
@result = ();
foreach my $i (@$ref) {
push @work, $i;
unless (@_) { push @result, join('', @work); }
else { comb(@_); }
pop @work;
}
return (@result);
}
}
'server0[123]', 'client0[1-35-7]', 'client0[13-69]'
の分解は可能なのですが、
'client[1-3][0-9]'
は
client10,client11,client12・・・・・・client37,client38,client39
となってほしいのですが、
client31,client32・・・・・,client38,client39となってしまいます。
また括弧の後ろに括弧無しがきた場合は、うまく展開できません。
お忙しいところ、誠にくだらない質問かもしれませんが、お力をお借りできれば幸いです。
よろしくお願いします。
お礼
sakusaker7 様 ありがとうございます。 quotemeta 、\Q \E どれも知りませんでした。 質問してよかったです。本当にありがとうございました。 >あくまでも例なんでしょうけど$a, $b という名前の変数は使わない方がいいです。 はい、普段は使いません。でも気をつけます。