[SP-pm] Dúvida sobre comparação de Strings ( =~ ou eq )

"Flávio R. Lopes" flavio.lopes at links.inf.br
Sat May 29 07:51:31 PDT 2010


Olá pessoal!
Seguindo com meus estudos, neste capítulo o autor pede para criar um 
programinha de adivinhação, que deve fazer o seguinte:
O usuário digita um número. Se ele acerta, o programa parabeniza-o e 
termina.
Caso o usuário não acerte o numero sorteado pelo programa, é aberto um 
novo prompt para o usuário digitar outro número.
E caso o usuário digitar "quit" ou "exit", o programa é encerrado.

Abaixo segue a solução que escrevi:
#!/usr/bin/perl

use strict;
use warnings;

#my $numero = int( 1 + rand 100 );
#print "$numero\n";

while (1) {

     my $numero = int( 1 + rand 10 );
     print "Escolha um numero: \n";
     chomp( my $escolha = <STDIN> );
     print "\n";

    # if ( ( $escolha eq /exit/i ) || ( $escolha eq /quit/i ) ) {
     if ( ( $escolha =~ /exit/i ) || ( $escolha =~ /quit/i ) ) {

         last;

     }
     elsif ( $escolha == $numero ) {

         print "Parabens!...Você acertou !!!\n";
         print "O Numero que você escolheu foi: $escolha\n";
         print "E o Numero sorteado foi: $numero\n";
         last;
     }
     elsif ( $escolha < $numero ) {

         print "O Numero que você escolheu foi: $escolha\n";
         print "E o Numero sorteado foi: $numero\n";
         print "Portanto $escolha < $numero\n";

     }
     else {

         print "O Numero que você escolheu foi: $escolha\n";
         print "E o Numero sorteado foi: $numero\n";
         print "Portanto $escolha > $numero\n";
     }

}


Da primeira vez que escrevi, eu usei:
    if ( ( $escolha eq /exit/i ) || ( $escolha eq /quit/i ) )

Ao executar o programa apareceu (supondo que tivesse digitado "1"):

Escolha um numero:
1

Use of uninitialized value $_ in pattern match (m//) at ./1.pl line 16, 
<STDIN> line 1.
Use of uninitialized value $_ in pattern match (m//) at ./1.pl line 16, 
<STDIN> line 1.
O Numero que você escolheu é: 1
E o Numero sorteado foi: 5
Portanto 1 < 5


E se eu escolher "quit" o programa NÃO É ENCERRADO:
Escolha um numero:
quit

Use of uninitialized value $_ in pattern match (m//) at ./1.pl line 16, 
<STDIN> line 1.
Use of uninitialized value $_ in pattern match (m//) at ./1.pl line 16, 
<STDIN> line 1.
Argument "quit" isn't numeric in numeric eq (==) at ./1.pl line 22, 
<STDIN> line 1.
O Numero que você escolheu é: quit
E o Numero sorteado foi: 5
Portanto quit < 5

Enfim minha dúvida:
Porque que não dá certo usar:
if ( ( $escolha eq /exit/i ) || ( $escolha eq /quit/i ) )

O operador de comparação "eq" não é para comparar strings? Porque então 
o programa não foi encerrado?

Só deu certo depois que mudei o código para (usando o Binding Operator):
     if ( ( $escolha =~ /exit/i ) || ( $escolha =~ /quit/i ) ) {

         last;

     }

Alguém poderia me ajudar a entender a diferença deles?

Abraço,
Flávio


More information about the SaoPaulo-pm mailing list