Mặc định biến $_ trong Perl

Tất cả biến trong Perl ngôn ngữ trong đó có một giá trị bắt đầu với những đồng đô la $. Ví dụ, bạn có thể tạo ra một biến $str hoặc $var.

Trong Perl đó là một đặc biệt biến $_. Có rất nhiều nơi trong ngôn ngữ Perl nơi nếu bạn không một cách rõ ràng chỉ một biến, biến sẽ được sử dụng $_. Đó là chìa khóa từ mà đọc giá trị từ biến này, và có những đó giá trị trong biến này. Nhưng trong biến này tiết kiệm những giá trị của riêng mình.

Từ khóa mà đọc giá trị từ $_

Như một ví dụ, một từ khóa mà đọc giá trị của biến mặc định dẫn print. Nếu bạn định print mà không cần lý lẽ, màn hình sẽ in các nội dung của một biến $_.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

print;

Đầu tiên, chúng ta lưu lại trong một biến $_ dòng 'Hello'(chú ý chúng tôi đã không được sử dụng từ khóa my).

Và sau đó chúng tôi sử dụng print, nhưng không phải gửi nó bất kỳ lập luận. Trong này sử dụng print hiển thị các nội dung của một biến $_. print; là giống như print $_;

Các kết quả — chương trình sẽ hiển thị các văn bản Hello.

Từ khóa print, say khi không lập luận được sử dụng mặc định biến $_. Nó là thú vị đó từ chính warn khi sử dụng không có lý lẽ biến $_ không sử dụng.

Một ví dụ khác khi muốn biến là một biểu hiện thường xuyên. Để áp dụng một biểu hiện thường xuyên đến một biến bạn cần phải viết $str =~ /.../. Và nếu bạn chỉ cần viết /.../, nó cũng giống như $_ =~ /.../.

Đây là một ví dụ mã:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

$_ = 'Hello';

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

Tình trạng if (/ll/) { kiểm tra xem các biến $_ hai chữ l trong một hàng. Bởi vì trong dòng'Hello' có hai chữ cái này, sau đó mã chạy print 'yes';, hiển thị các văn bản yes trên màn hình.

Từ khóa mà đặt giá trị trong $_

Thường xuyên nhất được sử dụng từ khóa mà thay đổi giá trị của biến $_foreach. Đây là một ví dụ mã:

▶ Run
#!/usr/bin/perl

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

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

Đây là cơ thể của những vòng lặp foreach là thực hiện 3 lần cho mỗi món hàng từ danh sách 'one', 'two', 'three'. Trước khi mỗi thực hiện các vòng cơ thể biến $_ là đặt bên cạnh tử trong danh sách. Vì vậy, anh có thể ghi lại chu kỳ này với một dấu hiệu rõ ràng về giá trị gì nên được đặt trong một biến $_: foreach $_ ('one', 'two', 'three') {

Và sau đó chúng tôi sử dụng say; đó là giống như say $_;.

Một cách khác để đặt một giá trị vào một biến $_ là để sử dụng while (<>) {. Đây là mã:

#!/usr/bin/perl

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

Này mã đọc thiết bị nhập và kết quả mỗi dòng như một sự giảm giá sách. Đây là một ví dụ như thế nào để làm việc với mã này trong diện:

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

Đầu tiên, chúng tôi sử dụng perl odnotrahniki, hiển thị ba đường, mỗi dòng hình. Và sau đó chúng ta đã đổi hướng này ra để đầu vào của một kịch bản mà chúng tôi chỉ viết. Cơ thể của những vòng lặp while (<>) { được thực hiện cho mỗi dòng đầu vào, và chuỗi này được đặt trong biến $_.

Ví dụ

Đây là một ví dụ khác của mã đó được tích cực sử dụng định biến $_:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

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

print Dumper \@arr;

Nếu bạn chạy chương trình này, nó sẽ xuất hiện trên màn hình:

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

Vì vậy, những gì đang xảy ra ở đây. Biểu hiện trong đó có một bài tập của các giá trị cho các mảng @arr bạn cần phải đọc từ phải sang trái.

  • Đầu tiên, chúng tôi xác định danh sách các ba dây ('one', 'two', 'three')
  • Sau đó, chúng tôi sử dụng từ khóa grep đến danh sách này. grep nơi mỗi nguyên tố từ ban đầu danh sách để biến $_ và kiểm tra, được viết trong ngoặc. Nếu kiểm tra này trở về thực sự, sau đó grep trả về giá trị của sách. Trong ví dụ này, ngoặc chứa một biểu hiện thường xuyên được áp dụng để biến mặc định. Này biểu hiện thường xuyên sẽ đáp ứng chỉ dây mà bao gồm chính xác ba nhân vật. Các kết quả của grep là một danh sách của hai dây ('one', 'two').
  • Một danh sách của hai yếu tố rơi vào map. Này, từ khóa đặt mỗi mục danh sách trong biến mặc định và thực thi mã được viết trong ngoặc. Những kết quả có lợi nhuận mã là một mục danh sách mà trở về map. Trong ví dụ này, chúng tôi sử dụng các chức năng lcfirst, trả về một chuỗi có nhân vật đầu tiên là hoa. Nếu chức năng này không chỉ định một cuộc tranh luận, sau đó nó hoạt động với biến mặc định.

Tài liệu chính thức

Đây là một đoạn trong đầu ra perldoc perlvar Chuyên nghiệp biến $_:

    $_      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 "<FH>", "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.

Chủ đề liên quan

Các bài viết khác