Hvad der er sandt og falsk i Perl

I programmeringssproget Perl ingen særlige værdier, der betyder, sandt og falsk.

Enhver værdi, der Perl kan fortolke som en Boolesk værdi. For eksempel strengen 'Hello' er sandt. Følgende kode viser string 'true':

▶ Run
#!/usr/bin/perl

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

Hvilke værdier er falsk

I programmeringssproget Perl er der 5 værdier, som er falske. Dette:

  • undef
  • 0 — 0
  • 0.0 — antal 0.0
  • '' — tomme streng
  • '0' — rækken 0

Her er et eksempel, der viser, at alle disse værdier er fortolket af Perl som en løgn. Koden vil vise 5 gange ordet 'false':

▶ Run
#!/usr/bin/perl

foreach my $val (undef, 0, 0.0, '', '0') {
    if ($val) {
        print "true\n";
    } else {
        print "false\n";
    }
}

Hvilke værdier er sande

Sandheden er, at alle værdier, undtagen dem, der er 5, der er falsk.

Reglen

For at huske, hvad der er falsk, du kan bruge reglen: "Alle, at 0 er falsk andre end '0, men sandt' træk".

Alle disse 5 værdier er falsk, hvis de bruges som tal bliver 0. Her er den kode, der bekræfter det, den kode, der viser 5 nuller:

▶ Run
#!/usr/bin/perl

foreach my $val (undef, 0, 0.0, '', '0') {
    print $val + 0, "\n";
}

Dog, hvis du bruger use strict; og use warnings; (som næsten altid værd at gøre), i tilfælde undef og den tomme streng Perl vil vise en advarsel.

Her er den kode, og resultatet af hans arbejde i sagen undef:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = undef;

print $var + 0;
Use of uninitialized value $var in addition (+) at script.pl line 8.
0

Og her er den kode, og resultatet i tilfælde af tom streng:

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = '';

print $var + 0;
Argument "" isn't numeric in addition (+) at script.pl line 8.
0

0 but true

I Perl der er sådanne værdier i en Boolean sammenhæng er sandt, men når det bruges i da antallet omdannet til tallet nul. Alle disse værdier er strenge.

For eksempel strengen '0ASDF' er et eksempel på en sådan værdi. Når det bruges som en Boolesk værdi denne streng vil blive fortolket som værende sand. Virkelig, der er kun 2 linjer, der er løgn — en tom streng og en streng, der kun indeholder en enkelt karakter er tallet nul, line '0ASDF' er ikke ingen af disse to linjer, så det er ikke en løgn og sandhed.

Her er den kode, der viser, hvad online '0ASDF' er sand (kode vil vise strengen 'true'):

▶ Run
#!/usr/bin/perl

if ('0ASDF') {
    print 'true';
} else {
    print 'false';
}

Hvis denne linje '0ASDF' til at bruge som et nummer, kan det tolkes som nummer 0 (men når i prisen use strict;, use warnings; vil være en advarsel):

▶ Run
#!/usr/bin/perl

use strict;
use warnings;

my $var = '0ASDF';

print $var + 0;
Argument "0ASDF" isn't numeric in addition (+) at script.pl line 8.
0

Den mest kendte brug af 0 but true værdier forekommer i Perl DBI bibliotek, det bruger string '0E0'.

Array, Hash, Reference

Array er sand, hvis der er mindst en værdi. Hvis du er i den matrix, der er ingen værdi, så array er falsk.

Tilsvarende, hvis hash har mindst et par af værdier, så hash er sandt. Hvis hash er ikke ingen par af værdier, det er en løgn.

Reference er altid rigtigt, ligegyldigt hvad det henviser til. Endnu en reference til et tomt array [] eller en tom hash {} er sandheden.

En og en tom streng

Ofte til at skrive i koden sandheden er en nummer et, og til at skrive løgne, der anvendes antallet nul.

Det er interessant, mener han, at den kanoniske Perl værdi til at betegne den løgn er ikke antallet 0, og den tomme streng ''.

Her er et eksempel, der viser dette. Vi tog linje 'Hello', som er sandheden, og med den kær-operatør ! forvandlet den til en løgn:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

print Dumper !'Hello';

Resultatet dukkede op på skærmen teksten $VAR1 = '';

Hvis du bruger operatøren ! to gange, får vi den kanoniske værdi for sandheden fra det synspunkt af Perl:

▶ Run
#!/usr/bin/perl

use Data::Dumper;

print Dumper !!'Hello';

(på skærmen vises teksten $VAR1 = 1;).

Problemet for læsbarhed

Ofte til at skrive i koden sandheden er en nummer et, og til at skrive løgne, der anvendes antallet nul. Men, desværre, ud fra disse tal er det ikke klart, hvad dette betyder — nummer (og der kan være andre tal), eller er et flag, der betyder sand.

Her er et eksempel. Her 1 for workers betyder, at du nødt til at bruge en enkelt arbejdstager (kan erstattes af 10). Og enhed har log betyder, at logføring er aktiveret (og kan kun udskiftes til 0 for at deaktivere):

my $config = {
    workers => 1,
    log => 1,
};

Andre artikler