我非常非常喜欢perl编程.
在阅读循环时,对于foreach循环,我有两个例子.
一个例子是,
foreach ('hickory','dickory','doc') { print $_; print "\n"; }
输出: -
hickory dickory doc
$ _变量包含每个项目.所以,它打印.
在另一个例子中,他们说没有在print语句中指定$ _变量.只有那里的空打印声明.它如何打印foreach参数.
foreach ('hickory','dickory','doc') { print; print "\n"; }
输出: -
hickory dickory doc
对于这也是相同的输出.它如何打印值.在那本书中,他们没有给出任何解释.我在互联网上搜索过.但我找不到任何东西.
你的问题关于print
在foreach
被回答,这里是多了几分$_
.
来自perlvar的General Variables
以下是Perl
$_
即使您不使用它也会假设的地方:
以下函数
$_
用作默认参数:
abs,报警,chomp,印章,chr,chroot,cos,定义,eval,evalbytes,exp,fc,glob,十六进制,int,lc,lcfirst,长度,日志,lstat,mkdir,oct,ord,pos,打印, printf,quotemeta,readlink,readpipe,ref,require,reverse(仅在标量上下文中),rmdir,say,sin,split(第二个参数),sqrt,stat,study,uc,ucfirst,unlink,unpack.
所有文件测试(
-f
,-d
)除外-t
,默认为STDIN.看到-X
模式匹配操作
m//
,s///
以及tr///
(也称y///
)在没有=~
操作员的情况下使用.
foreach
如果没有提供其他变量,则循环中的默认迭代器变量.
grep()
和map()
函数中的隐式迭代器变量.隐含变量
given()
.当a ,或操作的结果作为测试的唯一标准进行测试时
,放置下一个值或输入记录的默认位置.在测试之外,这不会发生.
readline
readdir
each
while
while
$_
默认情况下是一个全局变量.
正如您所看到的,它几乎可以在任何地方使用,而且确实经常使用它.请注意,perlvar页面描述了更多类似的变量,其中许多很容易了解.
这是一个例子.考虑一下我们从文件中读取行,想要丢弃只有空格或以#
(注释)开头的行,而其他人想要将它们按空格分成单词.
open my $fh, '<', $file or die "Can't open $file: $!"; while (<$fh>) { next if not /\S/; next if /^\s*#/; my @words = split; # do something with @words ... }
让我们看看$_
上面例子中有多少用途.这是一个等效的程序
while (my $line = <$fh>) { next if not $line =~ m/\S/; # if not matching any non-space character next if $line =~ m/^\s*#/; # if matching # after only (possible) spaces my @words = split ' ', $line; # split $line by ' ' (any white space) # do something with @words ... }
比较这两个
读取文件句柄<$fh>
的while
条件分配给$_
,然后在循环使用.
默认情况下,正则表达式的匹配运算符可用$_
.该m
本身可以被丢弃.
split
默认情况下拆分$_
.我们还使用另一个默认值,用于分割字符串的模式,即' '
(任何数量的空白空间).
一旦我们完成$line = <$fh>
交易$_
是关闭的(它在循环中是未定义的)我们必须在$line
任何地方使用.所以要么做这个,要么做while (<$fh>)
和使用$_
.
为了进一步说明这一点,让我们找到每行上最长的大写单词
use List::Util 'max'; my $longest_cap = max map { length } grep { /^[A-Z]/ } @words;
的grep的需要在列表@words
和块适用于每个元素.每个项目都分配给$_
,因此可用于块内的代码$_
.这是正则表达式默认使用的.满足条件的那些传递给map,map也迭代分配它们$_
,当然这是长度的默认值.最后max
从List :: Util中选出最大的一个.
请注意,$_
从未实际编写过,也不需要临时变量.
以下是一些相关文档.perlop中的I/O操作符讨论了while (<$fh>)
各种相关的事情.正则表达式部分位于perlop和perlretut中的Regexp Quote-Like Operators中.还看看拆分.
定期使用默认值并读取其他人必须理解的代码.当你编写自己的代码时,你可以选择是否使用$_
,因为总是可以引入一个词法变量而不是它.
那么,何时使用$_
默认值(不需要写入)和何时不使用?
$_
特别是,正确使用默认值可以使代码更清晰,更易读.通常意味着更好的代码.但是很有可能将这一点推得太远,最终会出现模糊,棘手和脆弱的代码.所以味道很好.
另一种情况是代码的某些部分受益$_
于其默认值,而在其他地方则必须$_
明确使用.我会说,如果$_
在代码段中看到多于一次或两次,则意味着应该有一个正确命名的变量.
总的来说,如果有疑问,只需命名一切.