当前位置:  开发笔记 > 编程语言 > 正文

如何在foreach声明中打印出这些值?

如何解决《如何在foreach声明中打印出这些值?》经验,为你挑选了1个好方法。

我非常非常喜欢perl编程.

在阅读循环时,对于foreach循环,我有两个例子.

一个例子是,

foreach ('hickory','dickory','doc') {
   print $_;
   print "\n";
}

输出: -

hickory
dickory
doc

$ _变量包含每个项目.所以,它打印.

在另一个例子中,他们说没有在print语句中指定$ _变量.只有那里的空打印声明.它如何打印foreach参数.

foreach ('hickory','dickory','doc') {
   print;
   print "\n";
}

输出: -

hickory
dickory
doc

对于这也是相同的输出.它如何打印值.在那本书中,他们没有给出任何解释.我在互联网上搜索过.但我找不到任何东西.



1> zdim..:

你的问题关于printforeach被回答,这里是多了几分$_.

来自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 ,或操作的结果作为测试的唯一标准进行测试时,放置下一个值或输入记录的默认位置.在测试之外,这不会发生.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 ...
}

让我们看看$_上面例子中有多少用途.这是一个等效的程序

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中.还看看拆分.


定期使用默认值并读取其他人必须理解的代码.当你编写自己的代码时,你可以选择是否使用$_,因为总是可以引入一个词法变量而不是它.

那么,何时使用$_默认值(不需要写入)和何时不使用?

$_特别是,正确使用默认值可以使代码更清晰,更易读.通常意味着更好的代码.但是很有可能将这一点推得太远,最终会出现模糊,棘手和脆弱的代码.所以味道很好.

另一种情况是代码的某些部分受益$_于其默认值,而在其他地方则必须$_明确使用.我会说,如果$_在代码段中看到多于一次或两次,则意味着应该有一个正确命名的变量.

总的来说,如果有疑问,只需命名一切.

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有