undef in Perl

undef in der Programmiersprache Perl ist einer der Werte, die in einer Variablen enthalten sein kann. Wenn keine Variable auf einen Wert festlegen, dann wird in der Variablen befindet sich undef.

Hier ist ein Beispiel für Perl-Programme:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $var;
print Dumper $var;

$var = 123;
print Dumper $var;

$var = undef;
print Dumper $var;

Dieses Programm zeigt auf dem Bildschirm:

$VAR1 = undef;
$VAR1 = 123;
$VAR1 = undef;

Zuerst haben wir eine Variable deklariert, aber nicht Gaben Ihr keine Bedeutung: my $var;. Weiter mit dem print Dumper $var; die Informationen über den Wert dieser Variablen auf den Bildschirm (ersichtlich, dass die Variable enthält undef). Danach vergeben wir die Variable Zahl 123und zeigte es auf dem Bildschirm. Und weiter mit dem Code $var = undef; vergeben wir die Variable undef und wieder die Informationen darüber.

undef kann ein Element in einem array oder Wert in хеше:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @arr = (1, undef, 'three');
print Dumper \@arr;

my %h = (
    a => undef,
);
print Dumper \%h;

Oft undef wird als eine spezielle Flagge. Beispielsweise kann eine Funktion, die immer eine Zahl zurück, aber im Falle eines Fehlers gibt undef.

Der name undef kommt vom englischen Wort undefined("undefiniert").

Als undef ist nicht

undef ist eine eigenständige Bedeutung. Es ist kein String 'undef', ist nicht der leere String '' und es ist nicht die Anzahl der 0. All dies sind unterschiedliche Werte.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $var (undef, 'undef', '', 0) {
    print Dumper $var;
}

Im Falle wenn der Wert des Schlüssels Hash undef ist nicht das gleiche wie in хеше fehlen solcher Schlüssel.

Wie überprüfe auf undef

Um zu prüfen, ob der Wert undef die Funktion defined. Der Wert ist undef wenn die Funktion defined gibt eine Lüge:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if (!defined($var)) {
    print 'var is undef';
}

Sehr einfach zu schreiben Sabu is_undef, die zurückgegeben werden wenn die Wahrheit in Sie übergaben undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);
use Data::Dumper;

sub is_undef {
    my ($maybe_undef) = @_;
    return !defined($maybe_undef);
}

my @arr = (1, undef, 'three');

foreach my $el (@arr) {
    say is_undef($el) ? 'undef' : 'not undef';
}

Aber meistens tun das nicht, sondern verwenden die Funktion defined ohne irgendwelche Umreifung.

Es gibt noch einen Weg, wie kann ich feststellen, dass in der Variable enthält undef ist verwenden Sie den Operator ~~ (dieser Operator heißt smartmatch). Dieser Operator erschien Perl 5.10, aber ab Perl 5.18 Verwendung dieses operators gibt eine Warnung aus Smartmatch is experimental at script.pl line 8.. Hier ist ein Beispiel Code mit diesem Operator:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var ~~ undef) {
    print 'var is undef';
}

Meistens ist die beste Methode für die überprüfung auf undef ist eine Funktion defined.

Perl undef und die Umwandlung in JSON

Bibliothek für die Arbeit mit JSON in Perl Perl wandeln Wert undef in null in JSON:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;

print encode_json {
    a => undef,
};

Dieser Code zeigt {"a":null}.

Und Umgekehrt, bei der Umwandlung von JSON null wird undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use JSON::PP;
use Data::Dumper;

print Dumper decode_json '[null]';

Dieser Code zeigt:

$VAR1 = [
          undef
        ];

Funktion ref

Das Ergebnis der Arbeit der Funktion ref in Bezug auf undef — es ist eine leere Zeichenfolge ''. In dieser Hinsicht undef unterscheidet sich nicht von den Zeilen und zahlen. Für undef, Zeilen und zahlen Funktion ref gibt eine leere Zeichenfolge zurück:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

foreach my $el ('asdf', undef, 100) {
    print Dumper ref($el);
}

Boolesch

Bei der Verwendung undef in der logischen Operationen undef — es ist eine Lüge. Dieser Code wird auf Bildschirm Text false:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

if (undef) {
    print 'true';
} else {
    print 'false';
}

Verwendung mit Streichern

In dem Fall verwenden, wenn undef Operationen mit Zeichenketten, statt undefwird verwendet der leere String '', aber auch wird eine Warnung angezeigt.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print 'AAA' . $var . 'BBB';
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var eq '') {
    print 'equal';
} else {
    print 'not equal';
}

Im ersten Fall wird eine Warnung angezeigt Use of uninitialized value in concatenation (.) or string at script.pl line 10., im zweiten Fall Use of uninitialized value in string eq at script.pl line 8..

Verwendung mit zahlen

In dem Fall verwenden, wenn undef - Operationen mit zahlen, statt undefwird verwendet die Anzahl der 0. aber so wird eine Warnung angezeigt.

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var + 4;
▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

if ($var == 0) {
    print 'equal';
} else {
    print 'not equal';
}

Im ersten Fall wird eine Warnung angezeigt Use of uninitialized value $var in addition (+) at script.pl line 8., im zweiten Fall Use of uninitialized value $var in numeric eq (==) at script.pl line 8..

Es ist interessant, dass bei der Verwendung der Inkrement-Operator ++ keine Warnung:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var;

print $var++;

Verwandte Themen

Andere Artikel