我非常非常喜欢perl编程.
在阅读循环时,对于foreach循环,我有两个例子.
一个例子是,
foreach ('hickory','dickory','doc') {
print $_;
print "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出: -
hickory
dickory
doc
Run Code Online (Sandbox Code Playgroud)
$ _变量包含每个项目.所以,它打印.
在另一个例子中,他们说没有在print语句中指定$ _变量.只有那里的空打印声明.它如何打印foreach参数.
foreach ('hickory','dickory','doc') {
print;
print "\n";
}
Run Code Online (Sandbox Code Playgroud)
输出: -
hickory
dickory
doc
Run Code Online (Sandbox Code Playgroud)
对于这也是相同的输出.它如何打印值.在那本书中,他们没有给出任何解释.我在互联网上搜索过.但我找不到任何东西.
你的问题关于print在foreach被回答,这里是多了几分$_.
以下是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 ,或操作的结果作为测试的唯一标准进行测试时
<FH>,放置下一个值或输入记录的默认位置.在测试之外,这不会发生.readlinereaddireachwhilewhile
$_默认情况下是一个全局变量.
正如您所看到的,它几乎可以在任何地方使用,而且确实经常使用它.请注意,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 ...
}
Run Code Online (Sandbox Code Playgroud)
让我们看看$_上面例子中有多少用途.这是一个等效的程序
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 ...
}
Run Code Online (Sandbox Code Playgroud)
比较这两个
读取文件句柄<$fh>的while条件分配给$_,然后在循环使用.
默认情况下,正则表达式的匹配运算符可用$_.该m本身可以被丢弃.
split默认情况下拆分$_.我们还使用另一个默认值,用于分割字符串的模式,即' '(任何数量的空白空间).
一旦我们完成$line = <$fh>交易$_是关闭的(它在循环中是未定义的)我们必须在$line任何地方使用.所以要么做这个,要么做while (<$fh>)和使用$_.
为了进一步说明这一点,让我们找到每行上最长的大写单词
use List::Util 'max';
my $longest_cap = max map { length } grep { /^[A-Z]/ } @words;
Run Code Online (Sandbox Code Playgroud)
的grep的需要在列表@words和块适用于每个元素.每个项目都分配给$_,因此可用于块内的代码$_.这是正则表达式默认使用的.满足条件的那些传递给map,map也迭代分配它们$_,当然这是长度的默认值.最后max从List :: Util中选出最大的一个.
请注意,$_从未实际编写过,也不需要临时变量.
以下是一些相关文档.perlop中的I/O操作符讨论了while (<$fh>)各种相关的事情.正则表达式部分位于perlop和perlretut中的Regexp Quote-Like Operators中.还看看拆分.
定期使用默认值并读取其他人必须理解的代码.当你编写自己的代码时,你可以选择是否使用$_,因为总是可以引入一个词法变量而不是它.
那么,何时使用$_默认值(不需要写入)和何时不使用?
$_特别是,正确使用默认值可以使代码更清晰,更易读.通常意味着更好的代码.但是很有可能将这一点推得太远,最终会出现模糊,棘手和脆弱的代码.所以味道很好.
另一种情况是代码的某些部分受益$_于其默认值,而在其他地方则必须$_明确使用.我会说,如果$_在代码段中看到多于一次或两次,则意味着应该有一个正确命名的变量.
总的来说,如果有疑问,只需命名一切.
| 归档时间: |
|
| 查看次数: |
391 次 |
| 最近记录: |