Toon posts:

[Perl] 0 en '0'

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Weet iemand misschien een manier om het verschil te bepalen tussen een string met het karakter '0' en een variabele met het cijfer 0?

Want onderstaande code levert nl in beide gevallen false op:
code:
1
2
3
4
5
$val = '0';
($val)?print "true":print "false";

$val = 0;
($val)?print "true":print "false";

Alvast bedankt.

  • RvdH
  • Registratie: Juni 1999
  • Laatst online: 28-07 15:42

RvdH

Uitvinder van RickRAID

Als de 0 *in* een string zit kun je er een regexje op loslaten.

Als de string alleen een 0 bevat, dan is dat precies hetzelfde als een integer met 0, perl ziet daar geen verschil tussen.

  • Juup
  • Registratie: Februari 2000
  • Niet online
Tja dit is een lastige. Perl converteert het karakter 0 naar de integer 0 voor je. Misschien kun je zien/testen of de scalar een integer is ofzo. Zoek eens met google

Een wappie is iemand die gevallen is voor de (jarenlange) Russische desinformatiecampagnes.
Wantrouwen en confirmation bias doen de rest.


  • Nikel
  • Registratie: Juli 2000
  • Niet online
In php is er geloof ik iets ranzigs met het erbij optellen van 0.000000000000000000000001 om er voor te zorgen dat het een int blijft/wordt, weet het niet meer precies.

  • Nikel
  • Registratie: Juli 2000
  • Niet online
Misschien heb je hier iets aan trouwens.

http://perl.about.com/library/weekly/aa082600c.htm

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Op dinsdag 05 februari 2002 13:01 schreef nonomen het volgende:
perlfaq4: How do I determine whether a scalar is a number/whole/integer/float?

Handig toch, zo'n FAQ?
Het is ook handig als je de vraag begrijpt als je een antwoord post :P

Today's subliminal thought is:


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Ik heb er ook even over nagedacht en volgens mij is het de bedoeling dat het onmogelijk is om dit verschil te bepalen. Perl ondersteund immers maar vier typen, te weten: scalaire variabelen, arrays, hashes (associatieve arrays) en resource handles.

Een getal en een string zijn in Perl dan ook van hetzelfde typen: beiden scalaire variabelen. Intern zal Perl inderdaad voor de ene of de andere representatie kiezen, afhankelijk van hoe de variabelen toegekend zijn en welke operaties er op uitgevoerd zijn. Volgens de specificatie van de taal zullen alle scalaire variabelen echter op dezelfe manier werken. Het is voor de gebruiker officieel dus niet mogelijk onderscheid te maken tussen de interne formaten van de variabelen.

In principe zou een Perl implementatie ook alle scalaire waardes op kunnen slaan als strings en de numerieke operatoren uitsluitend voor strings definiëren. De taal Perl zelf zou daardoor niet anders worden.

(Overigens heeft men bij de ontwikkeling van PHP voor een andere oplossing gekozen: daar ligt vast dat een scalaire waarde slechts uit een beperkt aantal subtypen kan bestaan. Die zijn dan ook vrij simpel op te vragen.)

Verwijderd

Topicstarter
Thanx.

Er is niet echt een manier in Perl om het verschil tussen 0 en '0' te bepalen dus (beetje jammer :().

Aangezien ik het wilde gebruiken bij het inserten van records in een mysql database heb ik het alsvolgt opgelost:

Ik wil alleen records inserten als ze nog niet in de db aanwezig zijn. Ik maak gebruik van een hash om de veld namen en waarden aan de functie te geven. Daarom initialiseer ik nu eerst alle id-velden (numeriek) van het record in de hash met een lege string ('') i.p.v. met een 0. Ik wil ook geen records in de database krijgen met alle velden 0. M.b.v. onderstaande code fragment kijk ik of de data geinsert moet worden en corrigeer ik de lege string waarde eventueel (door een 0).
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
....
foreach my $value (values(%$nameValue)) {
    if(length($value) > 0) {
    $insert = 1;
    }
    else {
    $value = 0;
    }
....
}
....
  if(!$insert) {
    return 0;
  }
....

Voor mij werkt dit goed, maar is helaas wel wat omslachtiger.

  • elnino
  • Registratie: Augustus 2001
  • Laatst online: 03-09 05:13
Op maandag 04 februari 2002 18:34 schreef Nikel het volgende:
In php is er geloof ik iets ranzigs met het erbij optellen van 0.000000000000000000000001 om er voor te zorgen dat het een int blijft/wordt, weet het niet meer precies.
Volgens mij kent PHP ook gewoon casting.

Dus $i = (int) '23'; wordt een integer. Zie ook hier.

Of je kunt de functie settype() gebruiken.
Pagina: 1