Newsgroup: it.comp.lang.perl
Titolo: problema confronto stringhe

Ciao a tutti,
mi sono imbattutto in un problema banale ma non capisco dove sbaglio.
Sto utilizzando ActivePerl 5.8 su windows 2000 e sto pacendo un piccolo
script.
Date un'occhiata al codice sottostante: in pratica l'uguaglianza è
sempre soddisfatta!
(mi scrive sempre "Non ho capito nulla!")
Come puo' essere?
Ho questo tipo di problemi quando confronto stringhe racchiuse tra apici
singoli ' '   e tra doppi apici " " (con i numeri invece tutto  ok) .
Cosa mi sta sfuggendo?
------------
$prova='ciao';
$prova2='ciaoo';
if ($prova2==$prova) {
    print "\nNon ho capito un nulla!";
}
else {
    print "\nQualcosa ho capito!";
}
-------------

> if ($prova2==$prova) { .. }
Ti faccio due esempi pratici:
$stringa = "ciao"; 
$stringadue = "ciaoo"; # meglio usare sempre i doppi apici
if ($stringa eq $stringadue) { print "uguali\n"; }
else { print "diversi\n"; } 
# stamperà sicuramente diversi, poichè eq (uguaglianza fra stringhe) 
# non è verificata
Questo è un altro, un *po'* più sofisticato:
$stringa = "ciao";
$stringadue = "CIAO";
if ($stringa =~/$stringadue/i) { print "uguali\n"; }
else { print "diversi\n"; }
# Qui stamperà uguali, lascio a te il piacere di scoprire perchè :D
L'ultimo esempio rappresenta le REGEX (REGular EXpressions), un metodo
senza dubbio più efficiente per confrontare le stringhe, modificarle,
sostituirle e agire in base all'input dell'utente (o dei server se usiamo
applicazioni con socket.). Leggiti qualche guida a riguardo, si posson
fare tante tante cose..
Saluti
---
while ($school) { sleep; }
ndr
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it




Ti ringrazio molto erano 2 ore che ci sbattevo la capoccia, ora mi funziona
tutto!
Ho fatto uno script che fa delle sostituzioni in un file di testo usando le
espressioni regolari. Il confronto mi serviva per verificare il valore
contenuto nell' $ARGV[3] fosse "all" (in questo caso sostituisco tutte le
occorrenze, non solo la prima)
Non sapevo che si dovesse usare la "eq" per confrontare le stringhe!
ciao e grazie ancora!

 occorrenze, non solo la prima)
Per fare il parse di $ARGV di consiglio di usare il modulo Getopt::Long.
È un modulo apposito ed è molto comodo.
Ciao,
-- 
+--------+ ASCII ribbon campaign ( )
|  kral  |  - against HTML email  X
+--------+              & vCards / \


Grazie del suggerimento, mi sono letto le spiegazioni sul manuale e mi
funziona..
Questo è il codice:
------------------------
use Getopt::Long;
$result = GetOptions ("f=s" => \$path_file, "s=s" => \$stringa, "n=s" =>
\$nuova_stringa);
------------------------
in pratica io chiamo la mia applicazione con i seguenti parametri:
-f  fileditesto.txt  -s stringadacercare  -n stringadasostituire    (e tutto
funziona come dovrebbe)
Il problema ora è che se per errore ometto un "-", oppure scrivo "-m" al posto
di "-n" un parametro rimane vuoto! Come faccio ad accorgermi di un errore di
sintassi di questo tipo? Vorrei che lo script fosse eseguito solo se i
parametri sono quelli da me elencati nella GetOptions(). Nel  caso si
sbagliasse a digitare il programma dovrebbe stampare un messaggio di avviso...
grazie

 # Qui stamperà uguali, lascio a te il piacere di scoprire perchè :D
Tanto per essere completi, questo stampera` "uguali" anche se,
ad esempio, hai:
$stringa = "cacciaopesca";
$stringadue = "ciao";
Questo accade poiche' e` sufficienche che $stringadue sia contenuta in
$stringa. L'espressione andrebbe meglio riscritta cosi`:
if ($stringa =~ /^$stringadue$/i) { print "uguali\n"; }
Detto questo, per confrontare due stringhe senza tener conto del case si
possono anche evitare le regular expression:
if (lc($stringa) eq lc($stringadue)) { print "uguali\n"; }
	Michele.

 sempre 1...
La butto lì:
Dopo il GetOptions:
unless($path_file && $stringa && $nuova_stringa) { die "I primi tre
campi sono obbligatori\n"; }
