Toon posts:

[PERL]Undefined value bij gebruik van strict

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een voorbeeldscrippie wat resulteert in een foutmelding:
"Can't call method "addfile" on an undefined value at ./undefined_value.pl line 25."

Ik weet van de voordelen van 'use strict' en wil het om die reden ook graag gebruiken, maar dan loop ik dus tegen de bovengenoemde melding aan.

Als ik alle 'my's en 'use strict;' verwijder werkt het gewoon.

In de subroutine MD5en heeft $file een ingestelde waarde en opent ie ook op filehandle FILE het gevonden bestand.

Kan iemand mij tip van de hand doen hoe ik die value die nu dus undefined is wel kan definieren bij het aanroepen van de Digest-MD5 module?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#! /usr/bin/perl -s

use strict;
use Digest::MD5;

# check dir
foreach my $sf (<*>)
{
    if (-f $sf)
    {
        &MD5en($sf)
    }
}


# Open single file and calculate its MD5
sub MD5en
{
    my $file = shift();
    print "File to MD5: $file\n";
    open ('FILE', '<', "$file");
    binmode ('FILE');

    my $md5 = Digest::MD5->new;
    my $md5->addfile('FILE');
    my $digest = $md5->hexdigest;

    print "$digest\t$file\n";
    close('FILE');
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14-04 03:50
Perl is wat dit betreft (en niet alleen wat dit betreft :o) een beetje gaar, maar het komt erop neer dat je met 'my' een variabele in de lokale scope introduceert. Vervolgens kun je die variabele gewoon gebruiken. 'Use strict' zorgt ervoor dat het gebruiken van een niet-geïntroduceerde variabele een foutmelding oplevert.

Je hoeft dus maar één keer 'my $md5' te gebruiken om 'm te introduceren en daarna gebruik je 'm gewoon. Met $file doe je dat trouwens al wel goed. De reden dat je een melding krijgt over een undefined value is dat je met de tweede keer 'my $md5' een nieuwe variabele introduceert die de oude onzichtbaar maakt.

Use strict gebruiken is natuurlijk ook meer dan simpelweg een regel bovenaan en een heleboel my's toevoegen, anders zou het ook geen voordelen opleveren, hè. ;) Het idee is nu juist dat je door variabelen expliciet te introduceren duidelijk maakt welke variabelen wanneer in gebruik zijn (in plaats van dat alle mogelijke variabelen inherent bestaan, zoals in gewoon Perl).

[ Voor 27% gewijzigd door Soultaker op 11-01-2006 12:53 ]


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

muba

Prince of Persia!

Wat Soultaker zegt, klopt.
code:
1
my $md5->addfile('FILE');
moet zijn
code:
1
$md5->addfile('FILE');
, en dan werkt 't denk ik wel.

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


Verwijderd

Topicstarter
Dat klopt! :)
En dat is niet het enige. Ik snap het nu ook! Bedankt!

Verwijderd

Topicstarter
Toch nog een nabrander...

Nog een stukje Perl waarin ik ruzie heb met 'niet gedeclareerde variabelen' bij gebruik van strict.

Binnen de twee accolades na een IF declareer ik de variabele $machine.
Het probleem is dat ik die variabele $machine buiten die scope van dat voorwaardelijke statement niet kan gebruiken.
(Resulteert in Global symbol "$machine" requires explicit package name)

Ik weet dat dit voorwaardelijk statement aangeroepen kan worden als subroutine en vervolgens met een return($machine) de waarde van $machine terug kan geven.

Maar kan het ook zonder het aanroepen van zo'n subroutine? Dat moet toch haast wel.
Eigenlijk dus gewoon zoals de benedenstaande code, maar dan werkend. :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl -s -w

use strict;

if ($^O eq "Darwin")
{
        my $machine = "Mac";
}
elsif ($^O eq "linux")
{
        my $machine = "Linux";
}

print "Machine: $machine\n";

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 22:30
Je variabele gaat inderdaad gewoon 'out of scope'. Je zult hem buiten de accolades moeten declareren... De subroutines hebben er niets mee te maken...

[ Voor 24% gewijzigd door Rowwan op 12-01-2006 11:12 ]


  • _DeWie_
  • Registratie: November 2001
  • Laatst online: 10-04 16:23
He kan wel, maar dan moet je de variabele declareren buiten de if anders is die alleen in die scope geldig, dus :

code:
1
2
3
4
5
6
7
8
my $machine ;

if (bla)
{
  $machine = 'dsfdsf'
}

printf "Machine = %s\n", $machine
Verwijderd schreef op donderdag 12 januari 2006 @ 10:57:
Toch nog een nabrander...

Nog een stukje Perl waarin ik ruzie heb met 'niet gedeclareerde variabelen' bij gebruik van strict.

Binnen de twee accolades na een IF declareer ik de variabele $machine.
Het probleem is dat ik die variabele $machine buiten die scope van dat voorwaardelijke statement niet kan gebruiken.
(Resulteert in Global symbol "$machine" requires explicit package name)

Ik weet dat dit voorwaardelijk statement aangeroepen kan worden als subroutine en vervolgens met een return($machine) de waarde van $machine terug kan geven.

Maar kan het ook zonder het aanroepen van zo'n subroutine? Dat moet toch haast wel.
Eigenlijk dus gewoon zoals de benedenstaande code, maar dan werkend. :)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/perl -s -w

use strict;

if ($^O eq "Darwin")
{
        my $machine = "Mac";
}
elsif ($^O eq "linux")
{
        my $machine = "Linux";
}

print "Machine: $machine\n";
Pagina: 1