循环

“每个问题都有不止一种解决方法”

Perl支持传统的while循环:

  1. my $i = 0;
  2. while($i < scalar @array) {
  3. print $i, ": ", $array[$i];
  4. $i++;
  5. }

Perl也提供了until关键字:

  1. my $i = 0;
  2. until($i >= scalar @array) {
  3. print $i, ": ", $array[$i];
  4. $i++;
  5. }

这些do循环几乎和上面的循环等价(如果@array为空会抛出一个警告):

  1. my $i = 0;
  2. do {
  3. print $i, ": ", $array[$i];
  4. $i++;
  5. } while ($i < scalar @array);

and

  1. my $i = 0;
  2. do {
  3. print $i, ": ", $array[$i];
  4. $i++;
  5. } until ($i >= scalar @array);

基本的C风格for循环也可以使用。注意我们怎么将my放到for语句内部,这样声明的$i的作用于就仅限于循环内部:

  1. for(my $i = 0; $i < scalar @array; $i++) {
  2. print $i, ": ", $array[$i];
  3. }
  4. # $i在这里就不存在了,代码显得更加整洁。

这种for循环被视为过时的东西,应该尽量避免使用,使用原生的array迭代语法看起来更漂亮。注意:与PHP不同,forforeach关键字是等价的,选可读性比较好的那个来用就可以了:

  1. foreach my $string ( @array ) {
  2. print $string;
  3. }

如果你需要使用下标,range运算符..会创建一个匿名的整形数列表:

  1. foreach my $i ( 0 .. $#array ) {
  2. print $i, ": ", $array[$i];
  3. }

你无法迭代一个hash,而你可以迭代它所有的键。使用内置函数keys来取得包含这个hash所有键的array,然后使用foreach来遍历它:

  1. foreach my $key (keys %scientists) {
  2. print $key, ": ", $scientists{$key};
  3. }

因为hash没有既定的次序,键可能以任何次序返回,使用内置函数sort事先对包含键的array进行字母序排序:

  1. foreach my $key (sort keys %scientists) {
  2. print $key, ": ", $scientists{$key};
  3. }

如果你没有显示指定迭代器,Perl将使用默认迭代器$_$_是第一个也是最友好的一个内置变量

  1. foreach ( @array ) {
  2. print $_;
  3. }

如果使用默认迭代器,并且你希望在循环里只放一句语句,你可以使用下面这种超级简洁的语法:

  1. print $_ foreach @array;

循环控制

nextlast可以用来控制循环过程,在其他大部分编程语言中分别相当于continuebreak。一般约定,行标写成全部大写。在循环里加上行标以后,nextlast可以选择指定跳转到某个行标。下面的示例程序能够找出100以内的素数:

  1. CANDIDATE: for my $candidate ( 2 .. 100 ) {
  2. for my $divisor ( 2 .. sqrt $candidate ) {
  3. next CANDIDATE if $candidate % $divisor == 0;
  4. }
  5. print $candidate." is prime\n";
  6. }