[Perl/regexp] literal interpolatie probleempje

Pagina: 1
Acties:
  • 112 views sinds 30-01-2008
  • Reageer

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Ik zie op google groups er iedereen over praten maar niet voor mij geschikte oplossing komen.

Ik haal een email adres uit een database dus dan gebeurt er dit

$email="it0@hotmail.com";

je weet dan dan @hotmail wordt gezien als een array.

$email=~ s/@/\\@/;

werkt niet

Hoe voorkom ik deze interpolatie?

$email='it0@hotmail.com'

maar dat is niet wat ik bedoel, want zo krijg ik hem niet terug van DBI -> fetch_array.

Kan iemand me hiermee helpen aub.

  • Morrar
  • Registratie: Juni 2002
  • Laatst online: 08:30
Het lijkt me dat als je data uit een database haalt deze niet geïnterpreteerd wordt door Perl, dat gebeurd namelijk alleen in het script zelf, dat wel geïnterpreteerd moet worden...

Weet je zeker dat er niet iets anders fout gaat?

  • 2
  • Registratie: November 2000
  • Laatst online: 31-03 13:52

2

escapen?

Perl:
1
$email="it0\@hotmail.com";


edit:

Hm.. ik geloof dat hij dat ook wel door had .. maar dan begrijp ik ook niks van zijn vraag.

[ Voor 53% gewijzigd door 2 op 14-07-2003 01:56 ]


  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Wat er gebeurt is het volgende

Ik haal een email adres uit de database en stop dit in de variabele $email

Vervolgens roep ik een functie aan waar ik $email aan meegeef.
Op dat moment gaat het fout want dan wordt @hotmail geïnterpoleerd.

dus
code:
1
2
$email="it0@hotmail.com"
print $email."\n";


gaat fout (het komt op hetzelfde neer als mijn vorig verhaal).
Nu moet ik dus het @ teken escapen (insert \).
Maar omdat het een waarde is die ik terug krijg van een functie kan ik hem niet tussen single quotes zetten.
Quotemeta werkt ook niet. een Regexp zoals s/@/\\@/ werkt ook niet. Geen van alle escapen ze het '@' teken.

[ Voor 8% gewijzigd door it0 op 14-07-2003 08:51 ]


  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 04-08 13:06

GraasGast

Analogue Heaven

Waarschijnlijk word er niet geinterpoleerd maar geparsed. En waarschijnlijk kan je dit voorkomen door 'single quotes' ipv. "double quotes" te gebruiken. Ik weer niet of dit in Perl ook zo is, maar in php word de inhoud van single quotes niet geparsed op variabelen.

[ Voor 6% gewijzigd door GraasGast op 14-07-2003 10:07 ]


  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Interpoleren is in dit geval parsen. Daarnaast leg ik al uit dat single quotes niet kunnen omdat ik de waarde zo terug krijg van een functie.

Verwijderd

Dit is de code die ik gebruik en heb er nooit problemen mee. Met $email kan ik inprincipe alles doen.

code:
1
2
3
4
5
$query = "SELECT email FROM blabla WHERE bla = '$bla'";
$sth=$dbh->prepare("$query");
$sth->execute();
$sth->bind_columns(undef, \$email );
$row = $sth->fetchrow_arrayref;

  • GraasGast
  • Registratie: Oktober 2000
  • Laatst online: 04-08 13:06

GraasGast

Analogue Heaven

post eens een stuk code ofzo? op welk moment gaat het precies mis? op het moment dat je het uit de db in een var mikt?

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
De code waarom het gaat
code:
1
$e="a@b";


hoe escape ik het '@' teken, met het voorgaande als vast gegeven.

Verwijderd

code:
1
$e = "a@b";


Als dit je code is dan krijg je inderdaad een foutmelding. Je hebt het eerst over gegevens die je uit een database haalt en als er om een stukje code wordt gevraagd plaats je alleen dit. Uit niets blijkt dat de data die in $e moet komen uit een database komt. Wil je verder op weg geholpen worden dan lijkt het me verstandiger om meer code te plaatsen of duidelijker te zijn.

Dit is de enige juiste wijze!

code:
1
$e = "a\@b";

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Verwijderd schreef op 14 July 2003 @ 13:24:
code:
1
$e = "a@b";


Als dit je code is dan krijg je inderdaad een foutmelding. Je hebt het eerst over gegevens die je uit een database haalt en als er om een stukje code wordt gevraagd plaats je alleen dit. Uit niets blijkt dat de data die in $e moet komen uit een database komt. Wil je verder op weg geholpen worden dan lijkt het me verstandiger om meer code te plaatsen of duidelijker te zijn.
De reden waarom ik geen code plaats is omdat de code afleidt van het probleem, is niet terzake. Het gaat mij om het principe.

Inmiddels begrijp ik idd dat DBI::fetchrow_array constantes terug geeft. Dus in dat geval is het volgende geval
code:
1
$e='a@b';
Echter ik vraag me nog steeds af hoe je bij $e="a@b"; het @ teken kan escapen dmv van een regexp of een fucntie q,qq,quotemeta? Maar ik begin het vermoeden te krijgen dat het niet kan omdat perl ten alle tijden de variabelen en lists interpoleert.

Het gaat er mij dan ook om hoe kom ik van "a@b" naar "a\@b";

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:13
je kunt gewoon geen quotes gebruiken, dan wordt ie ook niet geparset. Concanaten lijkt me dan een goede oplossing $str = 'E-mailadres: ' . $emailadres

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Verwijderd

it0 ik kwam het volgende voorbeeld tegen:
code:
1
2
3
4
5
6
7
8
9
10
11
#process input data to escape special characters
my %specialChars=(
  "'","´",
  "\$","\\\$",
  "\@","\\\@",
  "\!","\\\!",
  "\n","",
  "\r","");
my $specialCharList=join("",keys %specialChars);
$innerHTML=~s/\\/\\\\\\\\/g;
$innerHTML=~s/([$specialCharList])/$specialChars{$1}/g;


http://www.wdvl.com/Autho...fortheWeb/enter_perl.html

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
zzzflitzzz bedankt maar het werkt niet als je $innerHTML="a@b"; opgeeft..

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:13
Begrijp je het verschil al tussen enkele en dubbele quotes? Kun je niet even een stukje relevante code posten, in het geheel? Dus waar ook de toewijzing van variabelen instaat etc. Want ik heb het idee dat je de fout in gaat bij het debuggen.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Nescafe: ik begrijp heel goed het verschil.
Maar daarom ook mijn vraag, als je een string hebt (") , dus geen constante (') hoe kan je dan deze string weer terug krijgen naar een constante of de metacharacters $ @ escapen.

Kortom kan je met perl van "a@b" naar "a\@b" gaan?

Door alle reacties weet ik genoeg truukjes om het bovenstaande te verkomen of te omzeilen maar ik vroeg mij af of het uberhaupt kan?

Verwijderd

$e = "a@b"; kan niet dus van $e = "a@b"; naar $e = "a\@b"; kan ook niet. Dus om $e = "a\@b"; te bereiken zal $e = "a@b"; anders moeten worden.


offtopic:
Je hebt al net zo kort geslapen als ik. :z :z :z

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:13
Nee maar volgens mij is het a@b niet in de code genoemd en komt dat direct uit de database. Of poep je een stukje code uit die vervolgens weer door perl uitgevoerd wordt? (eval)

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Verwijderd

nescafe schreef op 15 juli 2003 @ 09:25:
Nee maar volgens mij is het a@b niet in de code genoemd en komt dat direct uit de database. Of poep je een stukje code uit die vervolgens weer door perl uitgevoerd wordt? (eval)
:?
it0 schreef op 14 July 2003 @ 12:58:
De code waarom het gaat
code:
1
$e="a@b";


hoe escape ik het '@' teken, met het voorgaande als vast gegeven.

  • it0
  • Registratie: April 2000
  • Laatst online: 27-12-2025

it0

Mijn mening is een feit.

Topicstarter
Ja je kan altijd nog de string als een list gaan verwerken maar dat vind ik niet een elegante oplossingen, danwel erg kostbaar.

  • nescafe
  • Registratie: Januari 2001
  • Laatst online: 20:13
$e="a@b"; is geen vast gegeven. Perl maakt hier van: $e = "a"; (Bij de interpretatie)

Perl:
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

$e = 'a@b';
($e eq 'a@b') && print 1 or print 0;
($e eq 'a') && print 1 or print 0;
print "\n";

$e = "a@b";
($e eq 'a@b') && print 1 or print 0;
($e eq 'a') && print 1 or print 0;
print "\n";
geeft:
10
01

Dus, 'a@b' eq 'a@b' en "a@b" eq 'a'.


probeer het zelf eens
Perl:
1
2
$e = "a@b";
print $e;


Dus als je $e = "a@b"; gebruikt kan je hem niet meer escapen simpelweg omdat '@b' verloren gaat bij de interpretatie.

* Barca zweert ook bij fixedsys... althans bij mIRC de rest is comic sans


Verwijderd

_/-\o_ _/-\o_ _/-\o_
Pagina: 1