foreachの繰り返しに制限を加えたいんですが。

[上に] [前に] [次に]
taro [E-Mail] 2000/06/10(土) 02:27:03
どなたか教えてください。
下記の例でうまく動く方法を教えてください。

@a=(0,1,2,3,4,5,6,7,8,9,10);
forech $b (@a) {
  print $b;
}

とすれば,0,1,2・・・と表示されるのですが,これを$bを0,1,2,3というふうに出力させたい。
1,2,3,4とか2,3,4,5といったふうに繰り返しする量に制限を加えたいのですが,どうすればいいのでしょうか?

andi 2000/06/10(土) 02:51:02
foreach $b (@a){
  if($b > 0 && $b < 5){
    print $b;
  }
}

ということ?
それとも

foreach $b (@a){
  if($i++ < 4){
    print $b;
  }
}

ということ?

Fuji.♪ [E-Mail] [HomePage] 2000/06/10(土) 12:40:03
for ($i = 2; i < 6; i++) {
    print $a[$i];
}

とか?

Fuji.♪ [E-Mail] [HomePage] 2000/06/10(土) 12:40:45
う、
>for ($i = 2; i < 6; i++) {
for ($i = 2; $i < 6; $i++) {
に修正

taro [E-Mail] 2000/06/10(土) 13:32:23
[[解決]]
ありがとうございます。
なんとなくわかりました。
あつかましいようですが,ちょっと質問よりずれてしまうかもしれませんがもう少し。
csv.files=
time
a,a1,a2,a3,a4
b,b1,b2,b3,b4
c,c1,c2,c3,c4




となってるデータファイルより@dataに任意の数だけのデータを渡したいのです。
全部とりだすsubルーチンを下記のように設定してます。
sub csv_open {
    if (!open(CSV,"$csv_file")) { $msg = 'データファイルが見つかりません。'; &error; }
    @data_lines = <CSV>;
    close(CSV);
    $time_data = $data_lines[0];
    shift (@data_lines);
}
で,foreach文で@data_lineから100番目から200番目までのサンプルを@dataにとりだそうと考えてたんです。
そうすると

foreach (@data_lines) {
        if($i++>100){push(@data,$_)}
        if($i=200){last;}
        }
で,いいんでしょうか?
最初からcsv filesを開くときに100個のサンプルを取る方法はないものでしょうか?

たこすけ 2000/06/10(土) 13:35:43
for (1..4) {
  print $a[$_];
}

とか?

andi 2000/06/10(土) 13:37:36
sub csv_open {
  if (!open(CSV,"$csv_file")) { $msg = 'データファイルが見つかりません。'; &error; }
  $time_data = <CSV>;
  while(<CSV>){
    if($i > 100 && $i < 200){
      push(@data_lines,$_);
    }
  }
  close(CSV);
}

かな。

たこすけ 2000/06/10(土) 13:38:30
あ、遅かった。
上の発言は無視して下さい。

andi 2000/06/10(土) 13:38:50
あ、間違え。

  while(<CSV>){
    if($i > 100 && $i <= 200){
      push(@data_lines,$_);
    }
    $i++;
  }

かな。

たこすけ 2000/06/10(土) 13:39:34
更に遅かった・・・
本当に、ごめんなさい。。。

taro [E-Mail] 2000/06/10(土) 14:04:31
[[解決]]
ありがとうございます。
一度ためしてみます。

2000/06/10(土) 15:16:02
>@data_lineから100番目から200番目までのサンプルを@dataにとりだそう

@data = @data_line[99..199];

だけでいいのでは?

ちなみに
>$time_data = $data_lines[0];
>shift (@data_lines);

はこれだけでよい?
$time_data = shift (@data_lines);

[上に] [前に] [次に]