Je l'appellerais "mauvaise forme", car il n'est tout simplement pas nécessaire. Vous n'avez pas besoin de booléenne convertir en Perl. Et donc, au mieux, c'est redondant, et au pire c'est un obscurcissement.
Bien qu'il existe quelques très belles astuces que vous pouvez utiliser en Perl, l'un des plus grands problèmes avec la langue (en terme de perception au moins), c'est qu'il est plutôt enclin à "écrire une fois" du code.
Après tout - pourquoi n'avez-vous jamais besoin de "double-inverser' un scalaire pour obtenir un booléen, quand vous pouvez tester le scalaire?
my $state = !! 'some_string';
if ( $state ) { print "It was true\n" };
Ou:
if ( 'some_string' ) { print "It was true\n" };
Et c'est vrai - vous pouvez écrire quelques terrifiant inintelligible code Perl grâce au "secret" des opérateurs, des signes de ponctuation à base de variables, etc. Et ça marchera très bien - par exemple, je considère que c'est un chef-d'œuvre: 3-D Stéréogramme, reproductible source
Mais il n'est pas "bon code". Pour le "monde réel" l'utilisation, votre code doit être claire, compréhensible et facile à résoudre.
Concernant les solutions de remplacement;
while (my $line = <$F>) {
# snip
exists $counts{lines} and $counts{lines} += !! chomp $line;
}
C'est ... compter combien de fois vous avez réussi à chomp
ed une ligne, je pense? Donc, fondamentalement, il seulement compte des numéros de lignes dans votre entrée.
Pour cela, je serais de la pensée " utiliser $.
'. À moins que j'ai raté quelque chose d'important au sujet de votre code?
"Si ce n'est pas chomp?"
Eh bien, OK. Comment à ce sujet:
$counts{lines}++ if foo();
Pour cela:
sub foo {
my ($input) = @_;
my %responses = ( "" => "False", 1 => "True" );
return $responses{ !! $input };
}
J'aurais écrit que:
sub foo {
my ($input) = @_;
return $input ? "True" : "False";
}
Pour la dernière condition d'emballage des drapeaux dans un octet:
sub flags {
my @boolean_flags = @_;
my $flags = 0;
for ( @boolean_flags ) {
$flags<<=1;
$flags++ if $_;
}
return $flags;
}
print flags ( 1, 1, 1 );
Ou peut-être si vous faites quelque chose comme ça - prendre une feuille à partir de combien de Fcntl
t-il par la définition de valeurs à ajouter basée sur la position, de sorte que vous n'avez pas à vous soucier de la position des arguments problème:
Vous pouvez demander à ce que le troupeau() constantes (LOCK_SH, LOCK_EX, LOCK_NB et LOCK_UN) être fourni par l'aide de la balise :flock
.
Et puis, vous pouvez:
flock ( $fh, LOCK_EX | LOCK_NB );
Elles sont définies au niveau du bit, de sorte qu'ils 'ajouter' via l' or
opérateur - mais cela signifie que c'est un idempotent de l'opération, où la définition LOCK_NB
deux fois de ne pas l'être.
Par exemple,
LOCK_UN = 8
LOCK_NB = 4
LOCK_EX = 2
LOCK_SH = 1
Si nous élargissons la question pour le moins subjectif:
Je vous demande les raisons pour l'éviter !!
- Perl évalue la "vérité" de variables, donc il n'y a pas vraiment besoin de beaucoup pour une réelle logique booléenne.
- Les instructions conditionnelles sont plus claires que leur équivalent algèbre booléenne.
if ( $somecondition ) { $result++ }
est plus claire que l' $result += !! $somecondition
.
- C'est un secret liste des opérateurs parce qu' il est obscur. Votre futur entretien programmeurs peuvent ne pas apprécier.
-
!!1
est 1
, !!0
est dualvar('', 0)
. Alors que c'est assez flexible, il peut surprendre, surtout depuis que la plupart des gens ne savent même pas ce qu'est un dualvar est, beaucoup moins qu' !
de retours. Si vous utilisez un ternaire, c'est explicite quelles sont les valeurs que vous obtenez:$value ? 1 : 0