[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