Newsgroup: it.comp.os.linux.sys
Titolo: perl regular expression modifier su una variabile

Vorrei gestire il case-sensitive senza duplicare il codice,
ma non ci riesco e nemmeno riesco a porre la domanda giusta a google.
#!/usr/bin/perl -w
my $case_insens="i";
# Togliere commento attiva case-sens: my $case_insens="";
if ($case_sens eq "i"){
	if ($str =~ m/trovami/i){ ## case insesitive
		print "trovato\n";
	}
} else {
	if ($str =~ m/trovami/){ # Case sensitive
		print "trovato\n";
	}
}
trasformando il codice in qualcosa di simile a questo ma
il compilatore non me la passa. c'è una sintassi che funzioni?
my $case_insens="i";
#my $case_insens="";
if ($str =~ m/trovami/$case_insens){ # Con variabile
	print "trovato\n";
}

 }
my $case_insens="i";
if ($str =~ m/trovami/.$case_insens){ # Con variabile
	print "trovato\n";
}

Il 06/05/2011 14:51, bio ha scritto:
PUNTO!!! Non avevo pensato che il punto funzionasse in quella posizione.
Testato funziona (ok tu lo sapevi già che funziona, ma a qualcuno
potrebbe tornare utile)
Grazie, risposta rapidissima.


 Grazie, risposta rapidissima.
L'unica cosa vera è che la risposta è stata rapida. Per il resto: non
la sapevo ed è sbagliata.
Ciao
fabio

 Per il resto: non la sapevo ed è sbagliata.
??? Provata mi ha funzionato, o almeno mi è sembrato.
Ho il contorno del codice non a posto. Una 15 di minuti che finisco 
quello che stavo scrivendo e riprovo.

 quello che stavo scrivendo e riprovo.
"=~" ha una precedenza maggiore di "." e quindi ho semplicemente 
concatenato il risultato del match "$str =~ m/trovami/" con "i",
che ritorna o "i" o "1i". Sempre "vero", quindi.
Fabio


ho controllato Sono quasi certo che funziona
#ho un codice di questo tipo e salvo effetti collaterali imprevisti funziona
provato per
# $aOutCmd   = "osgcal-doc"
# $sTestStr  = "^o.*cAl"
# $sTestModifier = "" oppure "i"
if ($aOutCmd =~ m/$sTestStr/.$sTestModifier){
     #codice per messaggio trovato
} else {
     #codice per messaggio NON trovato
}
mi restituisce:
Per $sTestModifier=""   :
	sTestModifier:[]La prima riga: osgcal-doc
	Non Valida la ricerca di:^o.*cAl
Per $sTestModifier="i"   :
	sTestModifier:[i] -> TROVATO


Argh! Ai Ragione
si avevo fatto il test fatto il test in un altro post
# $aOutCmd = "osgcal-doc"
# $sTestStr = "^o.*cAl"
si avevo provato che con $sTestModifier="i" :
il test passava anche se la A è maiuscola. Peccato che passi con 
qualsiasi cosa.
o provato con delle parentesi, ma sembra non gradisca ulteriori 
parentesi per modificare la precedenza degli operatori.

 Argh! Ai Ragione
Riferimento:
http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl
cercare (?i)
QUESTO PERO' FUNZIONA (spero)
per mod= "" o "i"
if ($str =~ m/(?$mod)$Test/){
	#OK trovato
}else{
	#NON Trovato
}
FAIL mod=[i], str=osgcal-doc, Test=^o.*calnomatch
FAIL mod=[i], str=osgcal-doc, Test=^o.*cAlnomatch
OK   mod=[i], str=osgcal-doc, Test=^o.*cAl
OK   mod=[i], str=osgcal-doc, Test=^o.*cal
FAIL mod=[], str=osgcal-doc, Test=^o.*calnomatch
FAIL mod=[], str=osgcal-doc, Test=^o.*cAlnomatch
FAIL mod=[], str=osgcal-doc, Test=^o.*cAl
OK   mod=[], str=osgcal-doc, Test=^o.*cal

 }
Però ho notato un trascurabile effetto collaterale. Mi sporca $1
cioè
Ho la variabile $1 assegnata durante la valutazione della regexp precedente.
Se utilizzo questa m/$Test/ $1 non viene modificato,
mentre con m/(?$mod)$Test/ diventa non inizializzato.
Un problema trascurabile, basta salvarsi preventivamente $1 su una 
variabile standard.