WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:範囲演算子が入った配列を展開

0:[投稿] おかめ [2002/05/23 17:57 ][環境:WIN+NN WIN系+Perl]

質問させて下さい。
Perlで、範囲演算子が入った配列を展開したいのですが、

$KENSAKU[0] = "1..3";
$KENSAKU[1] = "5";
$KENSAKU[2] = "11..15";
$KENSAKU[3] = "17";

$i = 0;
foreach (@KENSAKU){
 @DUMMY3 = $_;
 @DUMMY2 = push(@OK,@DUMMY3);
}
print @OK;
print "\n";

こうするとふつうに文字列"1..3,5,11..15,17"(見にくいのでカンマで区切っています)という風になってしまいます。
希望は
"1,2,3,5,11,12,13,14,15,17"
となってほしいのですが…

初心者なので書き方自体違うのかもしれないのですが。
教えて下さい。お願いします。


1:[回答] やじうま1号 [2002/05/23 21:08 ]

範囲演算子は、配列全体に代入する時に一つずつ代入するので、配列の特定要素に入れても効果はありません。

$i = 1;
while($i++){
  $KENSAKU[0] .= $i if($i <= 3);
  $KENSAKU[1] .= $i if($i == 5);
  $KENSAKU[2] .= $i if($i >= 11||$i <= 15);
  if($i == 17){
     $KENSAKU[3] .= $i;
     last;
  }
}

基本的にはこれで希望していたものが入ります(17のときifブロックを使ったのは無限ループだからです。)


2:[回答] ふじ [URL] [2002/05/23 22:33 ]

>@DUMMY3 = $_;
@DUMMY3 = eval $_;
とすればできます。
# が、あんまりきれいじゃないような・・・

リファレンスを使って、

$KENSAKU[0] = [1..3];
$KENSAKU[1] = [5];
$KENSAKU[2] = [11..15];
$KENSAKU[3] = [17];

foreach (@KENSAKU){
   push(@OK,@$_);
}

とか。


3:[完了] おかめ [2002/05/24 08:50 ]

やじうま1号様、ふじ様、ありがとうございます!
ふじ様の方法で希望の動作をしました。

>@DUMMY3 = eval $_;
なるほど、evalを入れると良いのですね。

>が、あんまりきれいじゃないような・・・
動作させるのに必死なのできっと全体もすごく汚いと思います…(苦笑)
なので、リファレンスを使用した方法を使わせていただきます。

>foreach (@KENSAKU){
> push(@OK,@$_);
>}

確かにパッと見でスマートな感じがしますね。
本当に助かりました。これからはきれいなスクリプトを作れるように努力します!
ありがとうございました。


4:[完了] おかめ [2002/05/24 14:00 ]

一度完了させてもらったのですが、
すみません。もう1つお願いします。
ふじ様のリファレンスを使った方法なのですが、
>$KENSAKU[0] = [1..3];
>$KENSAKU[1] = [5];
>$KENSAKU[2] = [11..15];
>$KENSAKU[3] = [17];

[1..3]ではなくあくまで 1..3 に対してはできないものなのでしょうか?
foreach (@KENSAKU){
 $DUMMY = "[".$_."]";
}
とかで無理やり[]を入れると出てくる答えは123ではなく[1..3]…
evalだと動作が遅いようのでリファレンスを使いたいのですが難しくて理解しきれないです…
重ね重ねすみません、よろしくお願いします。


5:[完了] ふじ [URL] [2002/05/24 15:49 ]

文字列として表現された "1..3" を範囲演算子と解釈させるには、
eval するしかないと思います。

やりたいことは、直にスクリプトに [1..3] と書くのではなく、
何らかの入力を処理した結果の文字列を 1..3 と生成して、
それを配列に展開したい、ということでしょうか?


6:[完了] おかめ [2002/05/25 10:12 ]

ふじ様、度々すみません。

>やりたいことは、直にスクリプトに [1..3] と書くのではなく、
>何らかの入力を処理した結果の文字列を 1..3 と生成して、
>それを配列に展開したい、ということでしょうか?

まさしくそのとおりです。
最初の結果を吐いた時点で[]を付ければよいのかも知れないのですが、量を少しでも減らすために範囲演算子としたので矛盾が生じる気がしてしまいました。
>eval するしかないと思います。
やっぱりですか…じゃあ頑張って他の部分で高速化を図ります。
ありがとうごさいます。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World