Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

use strict...

3 views
Skip to first unread message

Jørn Dahl-Stamnes

unread,
Dec 26, 2006, 4:59:45 PM12/26/06
to
Jeg har prøvd å få et script til å fungere, men med "use strict" får jeg
bare feil. Følgende testkode er et eksempel:

#!/usr/bin/perl

use strict;

my %data = ();
$data['alfa'] = "Alfa";
$data['beta'] = "Beta";

some_function (%data);
exit 0;

sub some_function ()
{
my %data = shift;

printf "alfa=%s\n",$data['alfa'];
printf "beta=%s\n",$data['beta'];
}

Slik som vist over får jeg følgende feilmeldinger ved eksekvering:
Global symbol "@data" requires explicit package name at ./test.pl line 7.
Global symbol "@data" requires explicit package name at ./test.pl line 8.
Global symbol "@data" requires explicit package name at ./test.pl line 17.
Global symbol "@data" requires explicit package name at ./test.pl line 18.
Execution of ./test.pl aborted due to compilation errors.

Men uten "use strict" går det greit.
Har prøvd å finne ut av dette via dokumentasjonen jeg har (boka "Programming
Perl"), men uten hell.

Kan noen fortelle hva dette skyldes? Hvor ligger feilen?
--
Jørn Dahl-Stamnes
http://www.dahl-stamnes.net/dahls/

Bjørn Furuknap

unread,
Dec 26, 2006, 5:03:27 PM12/26/06
to
Jørn Dahl-Stamnes wrote:
> Jeg har prøvd å få et script til å fungere, men med "use strict" får
> jeg bare feil. Følgende testkode er et eksempel:
>
> #!/usr/bin/perl
>
> use strict;
>
> my %data = ();
> $data['alfa'] = "Alfa";
> $data['beta'] = "Beta";

$data{'alfa'} = "Alfa";
$data{'beta'} = "Beta";


Ved å bruke [] jobber du med array (@) ikke hash (%).

Alternativt kan du sette 'my @data' i stedet for 'my %data' men det ser ikke
ut til at det er det du forsøker å gjøre.

.b
--
There is no grace, there is no guilt.
This is the law, Do what thou wilt!


Jørn Dahl-Stamnes

unread,
Dec 26, 2006, 5:36:09 PM12/26/06
to
Bjørn Furuknap wrote:

> Jørn Dahl-Stamnes wrote:
>> Jeg har prøvd å få et script til å fungere, men med "use strict" får
>> jeg bare feil. Følgende testkode er et eksempel:
>>
>> #!/usr/bin/perl
>>
>> use strict;
>>
>> my %data = ();
>> $data['alfa'] = "Alfa";
>> $data['beta'] = "Beta";
>
> $data{'alfa'} = "Alfa";
> $data{'beta'} = "Beta";
>
>
> Ved å bruke [] jobber du med array (@) ikke hash (%).
>
> Alternativt kan du sette 'my @data' i stedet for 'my %data' men det ser
> ikke ut til at det er det du forsøker å gjøre.

Takk... fant også ut av det etter at jeg postet (er det ikke typisk). Men
fremdeles virker det ikke. Riktignok har jeg fått test-scriptet til å
fungere:

use strict;

my %data = {};


$data{'alfa'} = "Alfa";
$data{'beta'} = "Beta";

printf "TEST: alfa=%s\n",$data{'alfa'};

some_function ("Dustemikkel",\%data);
exit 0;

sub some_function ()
{
my $msg = shift;
local (*data) = @_;

printf "Dette er en test, din %s\n",$msg;


printf "alfa=%s\n",$data{'alfa'};

printf "beta=%s\n",$data{'beta'};
}

Men i det virkelige scriptet får jeg enda feil, enda jeg har forsikret meg
om at ting skal være korrekt. Får følgende meldinger:

Variable "%maildata" is not imported at ./notify_organizers.pl line 109.
Variable "%maildata" is not imported at ./notify_organizers.pl line 110.
Variable "%maildata" is not imported at ./notify_organizers.pl line 112.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 109.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 110.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 112.
Execution of ./notify_organizers.pl aborted due to compilation errors.

Linjene 109-112 ligger i tilsvarende sub-funksjon som i eksemplet.

Jon Haugsand

unread,
Dec 26, 2006, 6:55:00 PM12/26/06
to
* Jørn Dahl-Stamnes

> Jeg har prøvd å få et script til å fungere, men med "use strict" får jeg
> bare feil. Følgende testkode er et eksempel:
>
> #!/usr/bin/perl
>
> use strict;
>
> my %data = ();
> $data['alfa'] = "Alfa";
> $data['beta'] = "Beta";

Det heter $data{'alfa'} = ....

--
Jon Haugsand
Dept. of Informatics, Univ. of Oslo, Norway, mailto:jon...@ifi.uio.no
http://www.ifi.uio.no/~jonhaug/, Phone: +47 45 00 39 94

Jon Haugsand

unread,
Dec 26, 2006, 7:08:08 PM12/26/06
to
* Jørn Dahl-Stamnes

> Linjene 109-112 ligger i tilsvarende sub-funksjon som i eksemplet.

Mener du at vi skal finne feil i ditt perl-script uten å se på koden?
(Det er i og for seg riktig tid for julenisser og sånt, men at noen
tror på dem...)

Jørn Dahl-Stamnes

unread,
Dec 27, 2006, 3:39:04 AM12/27/06
to
Jon Haugsand wrote:

> * Jørn Dahl-Stamnes
>> Linjene 109-112 ligger i tilsvarende sub-funksjon som i eksemplet.
>
> Mener du at vi skal finne feil i ditt perl-script uten å se på koden?
> (Det er i og for seg riktig tid for julenisser og sånt, men at noen
> tror på dem...)

Koden som feiler er identisk med den testkoden jeg sendte. Å sende ut flere
hundre linjer med kode er vel litt drøyt, eller?

For ordens skyld, disse linjene feiler:

sub send_notify
{
my $email = shift;
local (*maildata) = @_;

eval {
print $maildata{'sender'}; # linje 109
my $sender = new Mail::Sender {smtp => '127.0.0.1', from =>
$maildata{'sender'}, priority => 2}; #Linje 110
$Mail::Sender::NO_X_MAILER = 1;
ref $sender->Open ({to => $email, subject => $maildata{'subject'}}); #
Linje 112
... rest of code here.
}

Feilkodene er:


Variable "%maildata" is not imported at ./notify_organizers.pl line 109.
Variable "%maildata" is not imported at ./notify_organizers.pl line 110.
Variable "%maildata" is not imported at ./notify_organizers.pl line 112.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 109.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 110.
Global symbol "%maildata" requires explicit package name
at ./notify_organizers.pl line 112.

Jørn Dahl-Stamnes

unread,
Dec 27, 2006, 5:23:22 AM12/27/06
to
Jon Haugsand wrote:

> * Jørn Dahl-Stamnes
>> Linjene 109-112 ligger i tilsvarende sub-funksjon som i eksemplet.
>
> Mener du at vi skal finne feil i ditt perl-script uten å se på koden?
> (Det er i og for seg riktig tid for julenisser og sånt, men at noen
> tror på dem...)

Jeg har fjernet en del av den unødvendige koden i scriptet, samt fjernet
kommentarer og lagt ut koden her:

http://www.dahl-stamnes.net/dahls/feil.phps

De tre plassene hvor jeg enda får feil, er markert med kommentarer. Det
skjer i subrutinen:

Variable "%maildata" is not imported at ./feil.pl line 71.
Variable "%maildata" is not imported at ./feil.pl line 72.
Variable "%maildata" is not imported at ./feil.pl line 74.
Global symbol "%maildata" requires explicit package name at ./feil.pl line
71.
Global symbol "%maildata" requires explicit package name at ./feil.pl line
72.
Global symbol "%maildata" requires explicit package name at ./feil.pl line
74.
Execution of ./feil.pl aborted due to compilation errors.


PS: For å få til litt color syntaxing ala PHP, har jeg pakket hele fila inn
i <?php ... ?>.

Jørn Dahl-Stamnes

unread,
Dec 27, 2006, 7:45:30 AM12/27/06
to
Jon Haugsand wrote:

> * Jørn Dahl-Stamnes
>> Linjene 109-112 ligger i tilsvarende sub-funksjon som i eksemplet.
>
> Mener du at vi skal finne feil i ditt perl-script uten å se på koden?
> (Det er i og for seg riktig tid for julenisser og sånt, men at noen
> tror på dem...)

Julenisse eller ikke julenisse... etter å ha søkt på flere ulike steder på
nettet, fant jeg noe som gjorde at feilene forsvant. Endringen måtte gjøres
i subrutinen:

Endret jeg:
sub send_notify
{
my $name = shift;
my $uname = shift;


my $email = shift;
local (*maildata) = @_;

til:
sub send_notify
{
my $name = shift;
my $uname = shift;
my $email = shift;
my $hashref = shift;
my %maildata = %{$hashref};

så kompilerte koden. Den gamle koden fungerte den også, bare jeg ikke tok
med 'use strict;'.

0 new messages