--- title: '『新版Perl言語プログラミングレッスン入門編』第6章: 繰り返し のつづき' author: kazu634 date: 2008-02-07 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:3701;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - Perl ---

 つづきー

while

 繰り返しの中でlastを使うと、繰り返しを終了するよ。次のプログラムは「END」という行があったらそこで繰り返しを終了している。

use strict;
use warnings;
my @array = (, 1, 2, 3, 4, 5, 6, 7, 8, 9);
my $flag = ;
swhile ($flag < 10) {
$flag = $flag + 1;
if ($array[$flag] == 5){
last;
}
print "$array[$flag]\n";
}

こいつはこんな風に書き換えることも可能。

use strict;
use warnings;
my @array = (, 1, 2, 3, 4, 5, 6, 7, 8, 9);
my $flag = ;
while ($flag < 10) {
$flag = $flag + 1;
last if ($array[$flag] == 5);
print "$array[$flag]\n";
}

こっちの方がスマートだ。

 繰り返しの中でnextを使うと、繰り返しを「次」に進めます。たとえば次のようなプログラムだと、配列の5番目をスキップして表示することになるよ。

use strict;
use warnings;
my @array = (, 1, 2, 3, 4, 5, 6, 7, 8, 9);
my $flag = -1;
while ($flag < 10) {
$flag = $flag + 1;
next if ($array[$flag] == 5);
print "$array[$flag]\n";
}

 他にもredoとかあるよ。

for

 for文の構文は

for (初期化; 条件式; 次の一歩) {
繰り返して実行する部分
}

となるよ。例はこんな感じ。

use strict;
use warnings;
for (my $i = ; $i < 10; $i++) {
print "$i\n";
}

こいつはCライクな書き方だけど、perlではこれは次のように書くこともできる。

use strict;
use warnings;
for ( .. 9) {
print "$_\n";
}

do .. untilによる繰り返し

 do … until構文を使うと、条件判定をはじめに行うのではなく最後に行うことができます。次の文は、標準入力から入力された文字列を表示し、endが入力されると終了します。

use strict;
use warnings;
my $line;
do {
$line = <STDIN>;
print $line;
} until ($line eq "end\n");

do … while構文で書くこともできるけど、そのときは真偽が逆になることに注意してね。

use strict;
use warnings;
my $line;
do {
$line = <STDIN>;
print $line;
} while ($line ne "end\n");

文字列の繰り返し

 演算子xを用いると、文字列の繰り返しを作ることができます。例えば次の文は’-‘を40個表示します。

use strict;
use warnings;
print '-' x 40, "\n";

次のようにすると、文字列$strに合わせて横線の長さが上下するよ。

use strict;
use warnings;
my $str = 'Lord Jim: the Failure of Education';
print '-' x length($str), "\n";
print $str, "\n";
print '-' x length($str), "\n";

grepによる繰り返し

 関数grepは配列の中をすべてgrepする。

use strict;
use warnings;
my @word = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
my @found = grep(/^S/, @word);
print "@found\n";

mapによる繰り返し

 後で書く。