Chức năng defined() trong Perl

Perl ngôn ngữ đã được tích hợp trong chức năng defined().

Thường tính năng này được sử dụng để phân biệt các giá trị undef từ bất kỳ giá trị khác. Nhưng ngay cả với sự giúp đỡ của defined() , bạn có thể tìm hiểu cho dù bạn đã xác định một chức năng.

Kiểm tra undef

Chính áp dụng năng defined() là một kiểm tra về các giá trị undef.

Nếu các chức năng chuyển defined() giá trị undef, các chức năng sẽ trở lại sai. Các chức năng sẽ trở về 'đúng' nếu các giá trị mà nó chuyển bất cứ điều gì, nhưng undef. Đây là một ví dụ mã:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

print Dumper defined(8);
print Dumper defined(0);
print Dumper defined('');
print Dumper defined(undef);

Các kết quả của mã này:

$VAR1 = 1;
$VAR1 = 1;
$VAR1 = 1;
$VAR1 = '';

Kiểm tra chức năng đó là định nghĩa

Thông thường, các chức năng của defined() được sử dụng để phân biệt undef từ giá trị khác. Nhưng bên cạnh đó, sử dụng defined() bạn có thể tìm hiểu cho dù bạn đã xác định một chức năng. Đây là một ví dụ mã:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

print Dumper defined(&check);
print Dumper defined(&Data::Dumper::Dumper);

Chức năng check() không xác định, vì vậy defined() trở lại sai, Nhưng các chức năng Dumper một bó Data::Dumperdefined() trở về 'đúng'. Đó là những gì đây chương trình hiển thị trên màn hình:

$VAR1 = '';
$VAR1 = 1;

Lập luận

Nếu các chức năng defined() không cho không có lý luận, các chức năng làm việc với định biến $_:

Nếu các chức năng chuyển defined() nhiều hơn một cuộc tranh luận, nó sẽ là một lỗi và chương trình thực hiện sẽ được dừng lại:

Too many arguments for defined operator at script.pl line 3, near "3)"
Execution of script.pl aborted due to compilation errors.

Trở lại giá trị

Kết quả của những chức năng defined() luôn là một Phép giá trị. Đúng hay sai.

Sử dụng với một mảng và Manh

Rất lâu chức năng defined() làm việc trong một cách đặc biệt nếu anh nói với cô ấy một mảng hoặc băm như lập luận. Nhưng trong Perl 5.8 sử dụng này ban hành một cảnh báo, và kể từ 5.22 này sử dụng bắt đầu thất bại.

Đây là một mẫu mã đó trong defined() là thông qua một loạt:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @arr;

print Dumper defined(@arr);

Kết quả của điều này mã trong bản perl 5.8:

defined(@array) is deprecated at script.pl line 10.
    (Maybe you should just omit the defined()?)
    $VAR1 = '';

Kết quả của điều này khi 5.30 perl:

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at script.pl line 10.

Và cùng một mã, nhưng về băm:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my %h;

print Dumper defined(%h);

Các kết quả của công việc trên perl 5.8 và 5.30:

defined(%hash) is deprecated at script.pl line 10.
    (Maybe you should just omit the defined()?)
    $VAR1 = '';
Can't use 'defined(%hash)' (Maybe you should just omit the defined()?) at script.pl line 10.

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

Đây là kết quả của sự chỉ huy perldoc -f defined:

       defined EXPR
       defined Returns a Boolean value telling whether EXPR has a value other
               than the undefined value "undef".  If EXPR is not present, $_
               is checked.

               Many operations return "undef" to indicate failure, end of
               file, system error, uninitialized variable, and other
               exceptional conditions.  This function allows you to
               distinguish "undef" from other values.  (A simple Boolean test
               will not distinguish among "undef", zero, the empty string, and
               "0", which are all equally false.)  Note that since "undef" is
               a valid scalar, its presence doesn't necessarily indicate an
               exceptional condition: "pop" returns "undef" when its argument
               is an empty array, or when the element to return happens to be
               "undef".

               You may also use "defined(&func)" to check whether subroutine
               &func has ever been defined.  The return value is unaffected by
               any forward declarations of &func.  A subroutine that is not
               defined may still be callable: its package may have an
               "AUTOLOAD" method that makes it spring into existence the first
               time that it is called; see perlsub.

               Use of "defined" on aggregates (hashes and arrays) is
               deprecated.  It used to report whether memory for that
               aggregate had ever been allocated.  This behavior may disappear
               in future versions of Perl.  You should instead use a simple
               test for size:

                   if (@an_array) { print "has array elements\n" }
                   if (%a_hash)   { print "has hash members\n"   }

               When used on a hash element, it tells you whether the value is
               defined, not whether the key exists in the hash.  Use "exists"
               for the latter purpose.

               Examples:

                   print if defined $switch{D};
                   print "$val\n" while defined($val = pop(@ary));
                   die "Can't readlink $sym: $!"
                       unless defined($value = readlink $sym);
                   sub foo { defined &$bar ? &$bar(@_) : die "No bar"; }
                   $debugging = 0 unless defined $debugging;

               Note:  Many folks tend to overuse "defined" and are then
               surprised to discover that the number 0 and "" (the zero-length
               string) are, in fact, defined values.  For example, if you say

                   "ab" =~ /a(.*)b/;

               The pattern match succeeds and $1 is defined, although it
               matched "nothing".  It didn't really fail to match anything.
               Rather, it matched something that happened to be zero
               characters long.  This is all very above-board and honest.
               When a function returns an undefined value, it's an admission
               that it couldn't give you an honest answer.  So you should use
               "defined" only when questioning the integrity of what you're
               trying to do.  At other times, a simple comparison to 0 or ""
               is what you want.

               See also "undef", "exists", "ref".

Chủ đề liên quan

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