默认的变量 $_ Perl

所有的变量在Perl编程语言,其中含有单价值 开始与美元 $. 例如,可以创建一个变量 $str$var.

Perl有一个特殊的可变 $_. 有很多地方在编程语言 Perl在那里如果你没有明确指定一个变量,变量会被用 $_. 有关键词,阅读值从这个变量,而且还有那些 这套数值在这一变量。 但是,在这个变量 保存的价值在他们自己。

关键字就读的价值从 $_

作为一个例子,一个关键字读取的价值的默认可变 导致 print. 如果你指定 print 没有参数,将屏幕印刷内容的一个变量 $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

第一,我们保存在一个变量 $_ 线 'Hello'(注 我们没有使用关键词 my).

然后我们用 print,而不给它任何论点。 在此使用 print 显示的内容变 $_. print; 是相同 print $_;

结果—该计划将显示该文本 Hello.

关键词 print, say 时使用没有参数的使用 默认的变量 $_. 有趣的是,关键的字 warn 时使用 与没有参数的变 $_ 不要使用。

另一个例子时,使用默认的变量是一个经常的表达。 为了适用一个定期表达的变量需要编写 $str =~ /.../. 如果你只是写 /.../,它是一样的 $_ =~ /.../.

这里是一个小型的代码如:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

if (/ll/) {
    print 'yes';
} else {
    print 'no';
}

条件 if (/ll/) { 检查是否可变 $_ 两个字母 l 行中。 因为在线'Hello' 有这两封信的,那么代码运行 print 'yes';,其中显示该文本 yes 在屏幕上。

关键词,把价值 $_

最经常使用的关键词,改变了值的变 $_foreach. 这里是一个例子码:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

foreach ('one', 'two', 'three') {
    say;
}

这里的循环体 foreach 进行3次为每个项目从清单中 'one', 'two', 'three'. 之前的每次执行环身体在变 $_ 放置下一个元素。 所以你可以记录这种周期有一个明确的指示有什么价值应该放在一个变量 $_: foreach $_ ('one', 'two', 'three') {

然后我们用 say;的 相同 say $_;.

另一种方式把一个值转变 $_ 是使用 while (<>) {. 这里是代码:

#!/usr/bin/perl

while (<>) {
    print " * $_";
}

这个代码读标准输入和输出的每一行为的降价的清单。 这里是一个如何 工作与这个代码在控制台:

$ perl -e 'print "1\n2\n3\n"' | perl script.pl
 * 1
 * 2
 * 3

第一,我们使用perl odnotrahniki,它显示三条线,每条线图。 然后,我们必须重新定向这样的输出输入一个脚本我们只是写的。 循环体 while (<>) { 是每一个执行行的输入,并且这一串是放在可变 $_.

# 例

这里是另一个例子的代码这是积极使用的默认可变 $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

my @arr = map { ucfirst } grep { /^.{3}\z/ } ('one', 'two', 'three');

print Dumper \@arr;

如果你运行这个程序,就会出现在屏幕上:

$VAR1 = [
          'One',
          'Two'
        ];

那么,什么会在这里。 表达,其中有一个分配的价值观的阵 @arr 你需要从右到左。

  • 第一,我们确定了一个列表中的三个字符串 ('one', 'two', 'three')
  • 然后,我们使用的关键词 grep 到这个名单。 grep 的地方,每一个元件从原来的名单变量 $_ 和检查,这是写在括号. 如果 这个测试返回真的,那么 grep 返回价值的列表。 在这个例子中,括号内包含一个经常的表达,施加的默认可变的。 这经常表达的会只满足弦组成的三个字。 结果 grep 是一个列表中的两个串 ('one', 'two').
  • 一个列表中的两个要素落入 map. 这个关键字把每个名单中的项目 默认和执行的代码写在卷曲的括号。 结果返回 代码是一个列表中的项目,返回 map. 在这个例子中,我们使用的功能 lcfirst,其返回串的第一个字是资本化。 如果这个功能 不指定参数,那么它的工作的默认可变的。

官方文件

这一段的出 perldoc perlvar 亲变 $_:

    $_      The default input and pattern-searching space. The following
            pairs are equivalent:

                while (<>) {...}    # equivalent only in while!
                while (defined($_ = <>)) {...}

                /^Subject:/
                $_ =~ /^Subject:/

                tr/a-z/A-Z/
                $_ =~ tr/a-z/A-Z/

                chomp
                chomp($_)

            Here are the places where Perl will assume $_ even if you don't
            use it:

            *  The following functions use $_ as a default argument:

               abs, alarm, chomp, chop, chr, chroot, cos, defined, eval,
               evalbytes, exp, fc, glob, hex, int, lc, lcfirst, length, log,
               lstat, mkdir, oct, ord, pos, print, printf, quotemeta,
               readlink, readpipe, ref, require, reverse (in scalar context
               only), rmdir, say, sin, split (for its second argument),
               sqrt, stat, study, uc, ucfirst, unlink, unpack.

            *  All file tests ("-f", "-d") except for "-t", which defaults
               to STDIN. See "-X" in perlfunc

            *  The pattern matching operations "m//", "s///" and "tr///"
               (aka "y///") when used without an "=~" operator.

            *  The default iterator variable in a "foreach" loop if no other
               variable is supplied.

            *  The implicit iterator variable in the "grep()" and "map()"
               functions.

            *  The implicit variable of "given()".

            *  The default place to put the next value or input record when
               a "", "readline", "readdir" or "each" operation's result
               is tested by itself as the sole criterion of a "while" test.
               Outside a "while" test, this will not happen.

            $_ is a global variable.

            However, between perl v5.10.0 and v5.24.0, it could be used
            lexically by writing "my $_". Making $_ refer to the global $_
            in the same scope was then possible with "our $_". This
            experimental feature was removed and is now a fatal error, but
            you may encounter it in older code.

            Mnemonic: underline is understood in certain operations.

相关的主题

其他文章