27 votes

Opérateur Perl à trois points ... exemples

Quelqu'un peut-il montrer par quelques exemples la différence exacte entre .. et ... opérateur?

À partir de la perlop homme page:

Si vous n'avez pas envie de tester l'opérande de droite jusqu'à la prochaine l'évaluation, comme dans sed, il suffit d'utiliser trois points ("...") au lieu de deux.

Mais qu'est-ce exactement ce que cela signifie? Je ne comprends pas le perlop de l'exemple:

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

avec ... va imprimer l' Baz - mais pourquoi? Plus précisément, pourquoi est - Baz pas imprimé avec deux points, et uniquement avec des ...?

14voto

ikegami Points 133140

«...» ne fait pas un flop, vérifiez immédiatement après un vrai flip case.

Avec «..»,

  1. " - Foo"
    1. /0/ renvoie la valeur false.
    2. .. renvoie la valeur false.
  2. "01 - Bar"
    1. /0/ renvoie la valeur true. Flip!
    2. /1/ renvoie la valeur true. Flop!
    3. .. retourne true (depuis la première case qui était vrai).
  3. "1 - Baz"
    1. /0/ renvoie la valeur false.
    2. .. renvoie la valeur false.
  4. " - Quux"
    1. /0/ renvoie la valeur false.
    2. .. renvoie la valeur false.

Avec «...»,

  1. " - Foo"
    1. /0/ renvoie la valeur false.
    2. ... renvoie la valeur false.
  2. "01 - Bar"
    1. /0/ renvoie la valeur true. Flip!
    2. ... renvoie la valeur true.
  3. "1 - Baz"
    1. /1/ renvoie la valeur true. Flop!
    2. ... renvoie la valeur true.
  4. " - Quux"
    1. /0/ renvoie la valeur false.
    2. ... renvoie la valeur false.

4voto

theglauber Points 4937

Répéter l'exemple ici:

@lines = ("   - Foo",
          "01 - Bar",
          "1  - Baz",
          "   - Quux"
);
foreach (@lines) {
    if (/0/ .. /1/) {
        print "$_\n";
    }
}

C'est difficile... ce qui se passe lorsque vous utilisez les 2 points .. , c'est que lorsque vous atteignez "01 - Bar", les deux conditions sont testés et réussir (parce que la ligne a un 0 et aussi un 1). Si votre imprimante est sous tension et immédiatement désactivée.

Toutefois, lorsque vous utilisez ..., la première condition de la réussite, mais la seconde n'est pas essayé jusqu'à la prochaine itération de la boucle, de sorte "01 - Bar" s'allume et "1 - Baz" qui l'éteint. Donc vous voyez les deux lignes imprimées.

La partie la plus délicate est de réaliser que l' "01 - Bar" satisfait les deux critères.

3voto

kjp Points 1596

Si vous avez des cas comme /start/ .. /end/ avec entrée

start some text end
start
some other text
end

l' .. opérateur de processus de l' end dans la première ligne dès qu'il le lit, et ne imprimer some text. L' ... de l'opérateur de ne pas traiter l' end sur la première ligne de sorte que l'autre texte seront également imprimées. Fondamentalement, vous pouvez éviter l'arrêt de la gamme si la valeur de fin est appariés sur la même ligne que le début. L' ... remet le chèque jusqu'à la prochaine itération.

2voto

Flimm Points 8870

L'Article

Il y a un grand article intitulé Points et Perl, je vous recommande de le lire.

Pour résumer:

Un Point

  • L'opérateur de concaténation:

    say "one" . "two";
    # Outputs "onetwo"
    

Deux points

  • Opérateur d'intervalle:

    my @numbers = (1..100); # has one hundred numbers from 1 to 100
    
  • Flip-flop de l'opérateur:

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ .. m/END/;
    }
    

Trois points

  • Yada-yada déclaration:

    sub example {
        ...
        # throws "Unimplemented" exception when called
    }
    
  • Flip-flop de l'opérateur, à trois points de la version:

    while (my $line = readline($fh)) {
        process_this_line($line) if m/START/ ... m/END/;
        # The only difference between this and the two-dot version
        # occurs when a single line has both START and END
    }
    

Les autres réponses davantage de détails sur la différence entre les deux flip-flop opérateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X