Toon posts:

[perl] Controleer of variable leeg is

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik wil controleren of de inhoud van een scalar in een array leeg is. Probleem is dat ik het niet wil lukken 8)7 De volgende code had ik bedacht, maar blijkt niet te werken:

code:
1
if (@tempopslag[1] == ""){$tempopslag[1]="$regel";}


Als plaats 1 in de array tempopslag leeg is (geen waarde bevat), dan moet hij de inhoud van de variable regel hier opslaan. Als plaats 1 wel een waarde bevat, mag hij de inhoud van regel NIET opslaan.

Kan iemand mij vertellen wat er hier fout gaat? Deze if schijnt om de een of andere reden altijd waar te zijn, ook al bevat tempopslag al een waarde :?

Is er eventueel een andere manier om te controleren of een variable/array/deel van een array leeg is?

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op 08 oktober 2004 @ 18:30:
code:
1
if (@tempopslag[1] == ""){$tempopslag[1]="$regel";}
Je kijkt hierboven of de array-slice gelijk is aan de lege string. Dit waarschijnlijk niet wat je wilt. Probeer het volgende eens:

Perl:
1
2
3
4
if ( not defined $tempopslag[1] || $tempopslag[1] == "" ) 
{
   $tempopslag[1] = $regel; 
}

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
JaWi schreef op 08 oktober 2004 @ 20:35:
[...]


Je kijkt hierboven of de array-slice gelijk is aan de lege string. Dit waarschijnlijk niet wat je wilt. Probeer het volgende eens:

Perl:
1
2
3
4
if ( not defined $tempopslag[1] || $tempopslag[1] == "" ) 
{
   $tempopslag[1] = $regel; 
}
Ik ben je gigantisch dankbaar. Ik ben nu al sinds gisteravond naar deze code aan het zoeken. Zeer frustrerend als je wel weet hoe en wat je wil programmeren, maar de codes niet kent |:( Nu zijn er nog een paar vragen over.
1. Wat is precies een array slice? Is dat bijvoorbeeld de inhoud van @tempopslag[4]?
2. Mijn if statement ziet er nu zo uit:
code:
1
if (not defined $tempopslag[1]){$tempopslag[1]="$regel";}

Waarom zet jij dit:
code:
1
 || $tempopslag[1] == ""
er nog achter? Wat doet dat meer dan mijn huidige ifstatement?
3. Ik zou nog graag het verschil weten tussen:
code:
1
== ""
en
code:
1
not defined
en
code:
1
== 0

Hoe zeg ik nu dat de inhoud van variable gelijk moet zijn aan het cijfer nul, en hoe zeg ik dat de variable false moet zijn? Dit is nogal onduidelijk voor mij in mijn boek.
In ieder geval al enorm bedankt voor je hulp.

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op 08 oktober 2004 @ 21:26:
[...]

1. Wat is precies een array slice? Is dat bijvoorbeeld de inhoud van @tempopslag[4]?
Een array-slice (de naam zegt het al ;)) is een stukje uit een array. Zo kun je uit een (bestaande) array een aantal elementen pakken. Bijvoorbeeld:

Perl:
1
2
3
my @vierdeEnVijfdeElement = @tempopslag[4,5]; # Pak alleen 4e en 5e element
my $vierdeElement_v1 = $tempopslag[4];
my $vierdeElement_v2 = @tempopslag[4]; # Is hetzelfde als de vorige regel!
2. Mijn if statement ziet er nu zo uit:
code:
1
if (not defined $tempopslag[1]){$tempopslag[1]="$regel";}

Waarom zet jij dit:
code:
1
 || $tempopslag[1] == ""
er nog achter? Wat doet dat meer dan mijn huidige ifstatement?
Niet veel: het kijkt louter of $tempopslag[1] een lege string is. Je mag het weglaten als je alleen wilt dat wanneer $tempopslag[1] niet gedefinieerd is, deze gelijk gemaakt wordt aan de inhoud van $regel.
Ontzettend stomme opmerking: zie reply van Onno...
3. Ik zou nog graag het verschil weten tussen:
code:
1
== ""
en
code:
1
not defined
en
code:
1
== 0

Hoe zeg ik nu dat de inhoud van variable gelijk moet zijn aan het cijfer nul, en hoe zeg ik dat de variable false moet zijn? Dit is nogal onduidelijk voor mij in mijn boek.
In ieder geval al enorm bedankt voor je hulp.
Allereerst: in Perl de waarde 0 en undef is altijd onwaar en alle andere waarden zijn waar. Daarnaast kijkt Perl naar de context van een expressie en probeert zo een waar/niet waar uitspraak eraan te verbinden. Dit kan af en toe lastig zijn, maar het volgende stukje code maakt (hoop ik) wel duidelijk hoe de context van een expressie gebruikt wordt...

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
my $zeroValue = 0;
my $nonZeroValue = 1;
my $stringValue = "test";
my $undefValue = undef;

if ( $zeroValue == 0 ) { print "jep: 0 is gelijk aan 0!\n"; }
if ( $zeroValue ) { print "nee: 0 is toch geen ware uitspraak?\n"; }
if ( $nonZeroValue == 0 ) { print "nee: 1 is gelijk aan 0?\n"; }
if ( $nonZeroValue ) { print "jep: 1 is een ware uitspraak!\n"; }
if ( $stringValue ) { print "jep: Strings zijn ook ware uitspraken!\n"; }
if ( $stringValue == "" ) { print "JaWi moet 'use warnings' gebruiken!!!\n"; }
if ( not defined $undefValue ) { print "jep: 'not defined undef' is een ware uitspraak!\n"; }
if ( $undefValue ) { print "nee: undef is ook geen ware uitspraak?\n"; }


De uitkomst van het bovenstaande stukje code is alleen die zinnen die met "jep" beginnen.

edit:
oeps: een kleine typo in het gebruik van een array-slice!
edit2: domme opmerking eruit gehaald!

[ Voor 14% gewijzigd door JaWi op 08-10-2004 22:25 ]

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • Onno
  • Registratie: Juni 1999
  • Niet online
JaWi schreef op 08 oktober 2004 @ 22:05:
Niet veel: het kijkt louter of $tempopslag[1] een lege string is.
Niet bepaald. == is voor het vergelijken van getallen. Beide strings zullen dus omgezet worden naar een getal (een lege string heeft de waarde 0), en die worden vervolgens vergeleken.

Zo levert de expressie '0' == '' dus ook true op. Niet echt wat je wilt.

De juiste operator is eq, op de plaats waar je == gebruikt.

[ Voor 3% gewijzigd door Onno op 08-10-2004 22:19 ]


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Onno schreef op 08 oktober 2004 @ 22:19:
Niet bepaald. == is voor het vergelijken van getallen. Beide strings zullen dus omgezet worden naar een getal (een lege string heeft de waarde 0), en die worden vervolgens vergeleken.

Zo levert de expressie '0' == '' dus ook true op. Niet echt wat je wilt.

De juiste operator is eq, op de plaats waar je == gebruikt.
U heeft gelijk! Stom, stom, stom...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

Topicstarter
if ( $stringValue == "" ) { print "JaWi moet 'use warnings' gebruiken!!!\n"; }
Als ik de uitleg van onno goed heb zul je krijgen:

stringVaule is gelijk aan 1 en "" is gelijk aan 0 ->

1 == 0 Dit levert de waarde false. Heb ik hem zo goed?

Dit gaat zeker in de map nuttige info :) _/-\o_

[ Voor 11% gewijzigd door Verwijderd op 08-10-2004 22:36 ]


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op 08 oktober 2004 @ 22:35:
[...]
Als ik de uitleg van onno goed heb zul je krijgen:

stringVaule is gelijk aan 1 en "" is gelijk aan 0 ->

1 == 0 Dit levert de waarde false. Heb ik hem zo goed?
Nee, het is "iets" subtieler: Perl maakt onderscheid tussen getallen en strings, en voor elk type heeft het een vergelijkings-operator. De "==" operator werkt uitsluitend op getallen; Perl zal dus je string proberen naar een getal converteren: als de string geen numerieke karakters aan het begin bevat (bijv. "33test"), dan zal de waarde van de string op "0" gezet worden.
Om strings met elkaar te vergelijken gebruik je in Perl de "eq" operator.

(N.B.: Als ik mijn code voorzien had van het "use strict; use warnings;" pragma, dan had de Perl interpreter mij dit vanzelf vertelt... :X Moraal van het verhaal:
gebruik altijd "use strict; use warnings;" in je Perl scripts!)

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • zeroxcool
  • Registratie: Januari 2001
  • Laatst online: 04-05 13:54
JaWi schreef op 09 oktober 2004 @ 12:20:
[...]

(N.B.: Als ik mijn code voorzien had van het "use strict; use warnings;" pragma, dan had de Perl interpreter mij dit vanzelf vertelt... :X Moraal van het verhaal:
gebruik altijd "use strict; use warnings;" in je Perl scripts!)
Nee, dat gebruik je als je aan het debuggen bent :).

zeroxcool.net - curity.eu


  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

ZeRoXcOoL schreef op 09 oktober 2004 @ 12:41:
Nee, dat gebruik je als je aan het debuggen bent :).
Och, het is meer een kwestie van goed gebruik: mocht er een exceptie optreden in je script, dan kan de output die de Perl interpreter eruit gooit een mooie hint opleveren over waarom het misgegaan is...

Daarnaast worden beide pragma's alleen gebruikt tijdens de compilatie van je script, en hebben nauwelijks tot geen impact op je code, dus kwaad kan het ook weer niet...

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


Verwijderd

op z'n perlish:
code:
1
$tempopslag[1] or $tempopslag[1] = $regel;

  • JaWi
  • Registratie: Maart 2003
  • Laatst online: 14-01 21:58

JaWi

maak het maar stuk hoor...

Verwijderd schreef op 09 oktober 2004 @ 18:03:
code:
1
$tempopslag[1] or $tempopslag[1] = $regel;
Nah, veel makkelijker:

Perl:
1
$tempopslag[1] ||= $regel;

Statistics are like bikinis. What they reveal is suggestive, but what they hide is vital.


  • muba
  • Registratie: April 2002
  • Laatst online: 19-10-2013

muba

Prince of Persia!

Ik zie een aantal schandalige fouten, te beginnen bij de OP, maar ook enkele replies.

code:
1
$var == ""

Bekijk nog eens heel goed je perlop manpage (of je boek en dan het hoofdstukje dat gaat over operators, en het hoofdstukje dat gaat over het vergelijken van string, en het hoofdstukje dat gaat over het vergelijken van nummerieke waarden).

[ Voor 3% gewijzigd door muba op 10-10-2004 15:02 ]

Reporter: Mister Gandhi, what do you think of western civilisation?
Gandhi: I think it would be a good idea

Pagina: 1