Question

Je ne sais pas trop comment appeler ce type d'expressions, un exemple serait donc plus facile ...

Existe-t-il un moyen dans Perl d'évaluer des expressions telles que a < b <= c? J'ai un fichier de configuration qui permet à l'utilisateur de fournir des expressions conditionnelles pour certaines actions. Plutôt que de scinder la condition en deux parties (comme je le ferais normalement dans le code), j'aimerais la représenter de cette manière, si possible.

Était-ce utile?

La solution

Cela arrive dans Perl 6, bien sûr. Mais malheureusement, je ne pense pas que ce soit une des choses de Perl 6 empruntée par Perl 5.10.

Autres conseils

Les comparaisons chaînées sont présentées dans Perl 6.

Maintenant, serait est-il possible de créer une sous-routine de chaînage en chaîne pour Perl 5.x ? C'est une question intéressante ...

Ceci est légèrement moins lisible, mais accomplit ce que vous voulez: a < b && b <= c

Comme d'autres l'ont mentionné, Perl5 n'a pas (encore) comparé les chaînes.

Cependant, si vous analysez &, une < b < = c " à partir d'un fichier de configuration et je veux juste l'évaluer alors peut-être cela peut-être ce que votre direction après?

use strict;
use warnings;
use 5.010;

my ($a, $b, $c) = (10, 20, 30);

say 'Its true!'  if comparison( $a, '<', $b, '<=', $c );

sub comparison {
    my $left = shift;

    while (my $cmp = shift) {
        my $right = shift;
        compare( $cmp, $left, $right ) or return;
        $left = $right;
    }

    return 1;
}

sub compare {
    my $op = shift;
    given ($op) {
        when ( '<'  ) { return $_[0] <  $_[1] }
        when ( '<=' ) { return $_[0] <= $_[1] }
        default       { die "Invalid comparison operator" }
    }
}

Ce n’est qu’un exemple rudimentaire (c’est-à-dire incomplet et ne vérifiant pas les erreurs), mais je pense que vous avez l’idée.

Et vous trouverez peut-être déjà quelque chose comme ceci sur CPAN . Quelque chose comme Parse::RPN peut être un bloc de construction utile.

Maintenant, si votre question porte sur la façon d'analyser littéralement a < b <= c, il s'agit d'une autre bouillie de poisson!

/ I3az /

En ignorant toute validation d'entrée ou exécution de la comparaison éventuelle pour le moment, le code suivant (ou une variante mineure de celui-ci) devrait pouvoir réécrire votre déclaration:

sub rewrite {
    my $str = shift;
    my $ops = join "|" => qw/ < > <= >= == != /;
    1 while $str =~ s/ ($ops) \s* (\w+?) \s* ($ops) /$1 $2 && $2 $3/xg;
    $str
}

print rewrite "a < b < 5 < c != d";
# prints a < b && b < 5 && 5 < c && c != d
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top