让我长知识的 Perl 循环

这里先插一句题外话, 最近网上爆出了一个AndroidWebView安全隐患: Android底层提供了一个js与底层java交互的API, 如果浏览器使用了这个API, 用户用该浏览器访问恶意网址, 该网址中的js代码便可以调用任意系统命令, 造成很严重的问题. 详情请参考乌云的这篇文章安全宝的这篇文章. 请Android用户谨慎访问网页, 站长也要小心自己网站被xss攻击而被植入恶意js代码.

以下才是正文

Perl的循环很多样化, 既有常规的for, while, util, 也有各自相对应的单行形式, 给了perler很多发挥空间. 但是我在最近的编程过程中, 发现还有很多很cool的特性, 我们先来看下这段代码;)

loop one
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict;
use 5.010;

my ($i, $j, $k) = (10, 0, 0);

### loop 1
while ($i--) {

    {
        last if $i % 2 == 0;
        $j++;
    }

}
continue {
        $k++
}

say "[loop1] i: $i, j: $j, k: $k";

大家可以先猜一下结果;) 这个循环有两个让我涨姿势的特性: continue语句块语句块中的last. while循环后可以跟一个continue语句块, 每当继续下一次循环的时候会执行continue语句块中的内容. 因此即使使用next, continue中的语句还是会被执行; 任何一个匿名语句块都可以看成仅执行1次的循环, 因此可以使用last来跳出该语句块的执行, 实现类似C中的do {} while (0);的语法;)

个人认为这两个特性可以帮助简化程序书写流程, 避免过多的if嵌套. 另外还可以让自己的代码显得狂拽炫酷;)

我们再看一下这段代码:

loop two
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
### loop 2
($i, $j, $k) = (10, 0, 0);

for (1 .. 10) {

    do {
        last if $j == 5;
        $k++; $j++
    } while $i--;

    $i = 10;
    $j = 0
}

say "[loop2] i: $i, j: $j, k: $k"

恩, 是的, perl中也有do {} while循环. 但是请注意: last, next, redo语句在这里是不生效的, 一定要小心. 上面程序中的last跳出的是for循环. 详细说明请参考《Programming Perl》.

附上两个程序的输出:

1
2
3
[loop1] i: -1, j: 5, k: 10

[loop2] i: 5, j: 5, k: 5

PPPPSSSS

  1. 推荐一下博客园的这篇介绍国外黑客组织Anonymous文章. 《V字仇杀队》真心很好看;)
  2. 希望开复老师可以早日康复. 大家也要注意身体.

Comments