--- 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 ---
つづきー
繰り返しの中で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 (初期化; 条件式; 次の一歩) {
繰り返して実行する部分
}
となるよ。例はこんな感じ。
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構文を使うと、条件判定をはじめに行うのではなく最後に行うことができます。次の文は、標準入力から入力された文字列を表示し、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する。
use strict; use warnings; my @word = ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'); my @found = grep(/^S/, @word); print "@found\n";
後で書く。