Newsgroup: it.comp.lang.perl
Titolo: inizio di una stringa

Tempo fa qua sul NG mi avevato aiutotato a tirare fuori questa espressione
regolare.
Es.
un:url#frammento
un:url
Le stringhe dovrebbero fare match.
Questa è la regexp:
$href =~ /^$url(\#.*)?$/
Ho scoperto dopo un po di tempo, che non funziona proprio come mi aspettavo.
Supponiamo che
$url="
http://localhost/?parametro=1
"
e che $href = "
http://localhost/?parametro=1#frammento
"
Questo match non viene rilavato benché la parte sinistra al # (cancelletto)
sia identica per entrambe le stringhe.
Dove sbaglio?
Invece,
$url="
http://localhost/
"
e che $href = "
http://localhost/#frammento
"
viene riconosciuta correttamente.
Grazie e ciao.
--Gabriele

 
 $href =~ /^\Q$url\E(\#.*)?$/
Per il significato di '\Q' e '\E', si veda 
   perldoc perlre
Max

  $href =~ /^\Q$url\E(\#.*)?$/
Grazie mille ora funziona meglio di prima, pero' ...
Vorrei che l'espressione regolare matchasse anche il caso (attualmente
scartato)
in cui le le due stringhe da matchare abbiano la parte prima di cancelletto
(#) identica e
il resto invece sia diverso.
http://www.sito.it/#FRAMUNO
http://www.sito.it/#DIVERSO
L'espressione regolare di cui ho bisogno dovrebbe prendere per entrambe le
stringhe la parte a sinistra
del cancelletto e quindi confrontarla.
Ciao.
-- Gabriele

stringhe la parte a sinistra del cancelletto e quindi confrontarla.
Non riesco a capire se, in questi ultimi giorni, siamo diventati tutti
sordi, tutti muti o tutti rimbambiti (propendo per quest'ultima ipotesi, che
spiegherebbe, nel mio caso, perché non riesco a capire). Certo è che ci si
sgola da entrambe le parti senza concludere apparentemente nulla.
La soluzione che ti è stata proposta fa proprio quello che chiedi; o,
almeno, quello che io capisco della soluzione che ti è stata proposta fa
quello che io capisco di quello che tu chiedi.
Il problema di $href =~ /^$url(\#.*)?$/ è che la stringa $url può contenere
dei metacaratteri, che cambiano il significato dell'espressione regolare.
Quotando $url con \Q e \E, si risolve la cosa.
Così, almeno, io capisco o credo di capire. Se non capisco, posta un esempio
minimale di quello che fai, quello che ti aspetti che succeda e quello che
succede, per alcuni input critici in cui le due cose non coincidono.
Ciao.

 succede, per alcuni input critici in cui le due cose non coincidono.
Questo è uno script di esempio:
use strict;
my $url="
http://localhost/?parametro=1
";
my $href = "
http://localhost/?parametro=1#frammento
";
my $url2="
http://localhost/?parametro=1#altroframmento
";
my $href2 = "
http://localhost/?parametro=1#frammento
";
print "\n\nConfronto tra:\n   $url\n   $href\n";
if ($href =~ /^\Q$url\E(\#.*)?$/) {
 print "   trovato\n";
} else {
 print "   non trovato\n";
};
print "Confronto tra:\n   $url2\n   $href2\n";
if ($href2 =~ /^\Q$url2\E(\#.*)?$/) {
 print "   trovato: ".$href2."\n";
} else {
 print "   non trovato\n";
};
Ciao.
--Gabriele

considerazione tutta la stringa $url.
Io lascerei invariata la cardinalità del problema, senza tentare
l'unificazione dei campi, che sarà forse anche possibile, ma mi pare
complicata.
Fai:
    my $url2=   "
http://localhost/?parametro=1#altroframmento
";
    my $url3 = $url2;
    $url3 =~ s/#[^#]+$//;
e quindi:
   print "Confronto tra:\n   $url2\n   $href2\n";
   if ($href2 =~ /^\Q$url3\E(\#.*)?$/) {
      print "   trovato: ".$href2."\n";
   } else {
     print "   non trovato\n";
   }
O, eventualmente, se ti serve o può avere senso, un doppio controllo:
   print "Confronto tra:\n   $url2\n   $href2\n";
   if ($href2 =~ /^\Q$url2\E/ or $href2 =~ /^\Q$url3\E/) {
     print "   trovato: ".$href2."\n";
   } else {
     print "   non trovato\n";
   }
 
Questo, se vuoi continuare a fare tutto da solo. Il mio consiglio comunque,
per queste cose, è di usare i moduli che sono a disposizione per l'analisi
degli URL: la sintassi è in realtà più complessa di quello che si può
pensare a prima vista, e in ogni caso, piuttosto che risolvere di volta in
volta con un'espressione ad hoc, può essere conveniente fare una volta per
tutte un parsing completo dell'url. Modulo URI e simili.
Ciao.

 tutte un parsing completo dell'url. Modulo URI e simili.
Siccome il controllo in questo caso lo devo fare una sola volta ,
è conviente scomodare un modulo apposito?
Ciao.
--Gabriele.

è conviente scomodare un modulo apposito?
Dipende. Sei sicuro di aver considerato e risolto ogni possibile caso che
possa verificarsi? Non lo eri anche prima? Come mai, allora, sei tornato?
Per quanto mi riguarda, un url è già una struttura sufficientemente
complessa da scoraggiarmi, alla mia età, dall'impegnare troppe energie a
reinventare qualche raggio, se anche non l'intera ruota. Questa è comunque
solo la mia propensione personale, che come tale mi auguro non interessi a
nessuno. La risposta definitiva a quale sia la cosa più conveniente per te
puoi darla solo tu.
Ciao.