Tim*_*mmy 1 perl for-loop perlsyn
我正在查看perl代码,我看到了这个:
sub html_filter {
my $text = shift;
for ($text) {
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
}
return $text;
}
Run Code Online (Sandbox Code Playgroud)
for循环在这种情况下做了什么,为什么你会这样做?
该for环路的别名其循环到列表中的每个元素$_.在这种情况下,只有一个元素,$text.
在体内,这允许一个人写
s/&/&/g;
Run Code Online (Sandbox Code Playgroud)
而不是必须写
$text =~ s/&/&/g;
Run Code Online (Sandbox Code Playgroud)
反复.另见perldoc perlsyn.
如果没有显式循环变量,for循环将使用名为的特殊变量$_.循环中的替换语句也使用特殊$_变量,因为没有指定其他变量,因此这只是使源代码更短的技巧.我可能会把这个函数写成:
sub html_filter {
my $text = shift;
$text =~ s/&/&/g;
$text =~ s/</</g;
$text =~ s/>/>/g;
$text =~ s/"/"/g;
return $text;
}
Run Code Online (Sandbox Code Playgroud)
这将没有性能影响,并且可由Perl以外的人阅读.
正如Hewgill先生所指出的那样,代码示例隐式地对@_这个神奇的隐含变量进行了本地化和别名化.
他提供了一种替代品,它以样板代码为代价更具可读性.
为简洁起见,没有理由牺牲可读性.只需用显式版本替换隐式本地化和赋值:
sub html_filter {
local $_ = shift;
s/&/&/g;
s/</</g;
s/>/>/g;
s/"/"/g;
return $_;
}
Run Code Online (Sandbox Code Playgroud)
如果我不太了解Perl并且遇到了这段代码,我就知道我需要查看文档$_并且 - local这是一个奖励perlvar,有一些本地化的例子$_.
对于任何使用Perl的人来说,上面应该很容易理解.
因此,为了简洁起见,没有理由牺牲可读性.
| 归档时间: |
|
| 查看次数: |
596 次 |
| 最近记录: |