Resumen
- Boolesche Tests
- Inkrementieren oder Dekrementieren eines undefinierten Wertes
- Anhängen an einen undefinierten Wert
- Autovivifizierung
- Andere Mutatoren
Boolesche Tests
Nach Angaben der perlsyn-Dokumentation ,
Die Zahl 0
die Saiten '0'
y ''
die leere Liste ()
y undef
sind in einem booleschen Kontext alle falsch. Alle anderen Werte sind wahr.
Da der undefinierte Wert falsch ist, wird das folgende Programm
#! /usr/bin/perl
use warnings;
my $var;
print "A\n" if $var;
$var && print "B\n";
$var and print "C\n";
print "D\n" if !$var;
print "E\n" if not $var;
$var or print "F\n";
$var || print "G\n";
Ausgänge D
über G
ohne Warnungen.
Inkrementieren oder Dekrementieren eines undefinierten Wertes
Es besteht keine Notwendigkeit, einen Skalar explizit auf Null zu initialisieren, wenn Ihr Code ihn mindestens einmal inkrementieren oder dekrementieren wird:
#! /usr/bin/perl
use warnings;
my $i;
++$i while "aaba" =~ /a/g;
print $i, "\n";
Der obige Code gibt Folgendes aus 3
ohne Warnungen.
Anhängen an einen undefinierten Wert
Ähnlich wie bei der impliziten Null ist es nicht nötig, Skalare explizit mit der leeren Zeichenkette zu initialisieren, wenn man mindestens einmal an sie anhängt:
#! /usr/bin/perl
use warnings;
use strict;
my $str;
for (<*>) {
$str .= substr $_, 0, 1;
}
print $str, "\n";
Autovivifizierung
Ein Beispiel ist die "Autovivifizierung". Aus dem Wikipedia-Artikel :
Autovivification ist ein besonderes Merkmal der Programmiersprache Perl, das die dynamische Erstellung von Datenstrukturen ermöglicht. Autovivification ist die automatische Erzeugung einer Variablenreferenz, wenn ein undefinierter Wert dereferenziert wird. Mit anderen Worten: Perl-Autovivifikation erlaubt es einem Programmierer, auf eine strukturierte Variable und beliebige Unterelemente dieser strukturierten Variable zu verweisen, ohne die Existenz der Variable und ihre vollständige Struktur vorher ausdrücklich zu deklarieren.
Zum Beispiel:
#! /usr/bin/perl
use warnings;
my %foo;
++$foo{bar}{baz}{quux};
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
Auch wenn wir die Zwischenschlüssel nicht explizit initialisieren, kümmert sich Perl um das Gerüst:
$VAR1 = {
'bar' => {
'baz' => {
'quux' => '1'
}
}
};
Ohne die automatische Belebung würde der Code mehr Textbausteine erfordern:
my %foo;
$foo{bar} = {};
$foo{bar}{baz} = {};
++$foo{bar}{baz}{quux}; # finally!
Verwechseln Sie die Autovivifizierung nicht mit den undefinierten Werten, die sie hervorbringen kann. Zum Beispiel mit
#! /usr/bin/perl
use warnings;
my %foo;
print $foo{bar}{baz}{quux}, "\n";
use Data::Dumper;
$Data::Dumper::Indent = 1;
print Dumper \%foo;
erhalten wir
Use of uninitialized value in print at ./prog.pl line 6.
$VAR1 = {
'bar' => {
'baz' => {}
}
};
Beachten Sie, dass die Zwischenschlüssel autovivifiziert sind.
Andere Beispiele für Autovivifikation:
Leider kann Perl das Folgende (noch!) nicht autovivifizieren:
my $code;
$code->("Do what I need please!");
Andere Mutatoren
In einer Antwort auf eine ähnliche Frage , berichtet ysth
Bestimmte Operatoren lassen die Warnung "uninitialized" absichtlich weg, weil sie häufig in Situationen verwendet werden, in denen eine 0 oder "" als Standardwert für den linken oder einzigen Operanden sinnvoll ist.
Diese sind: ++
y --
(entweder vorher oder nachher), +=
, -=
, .=
, |=
, ^=
, &&=
, ||=
.
"Definiert-oder" sein //=
mutiert fröhlich einen undefinierten Wert ohne Warnung.