Schrift
[thread]5709[/thread]

Sub Routinen richtig anwenden?: Fehler bei use strict



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
xman
 2003-09-11 02:32
#50296 #50296
User since
2003-09-11
4 Artikel
BenutzerIn
[default_avatar]
Hi all,

ich habe folgendes Problem und möchte Euch um Hilfe bitten. Das Beispielsprogramm läuft nicht, wenn ich "use strict" und "my" benutze:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl -T  

use CGI::Carp qw(fatalsToBrowser);
use strict; # das möchte ich haben
my $conttype = "Content-type: text/html\n\n";

&eins;
&zwei;

sub eins{
my $text = "This is a test!";
}

sub zwei{
print $conttype;
print $text;
}


Fehlermeldung:

Code: (dl )
1
2
3
Software error:
Global symbol "$text" requires explicit package name at C:\Xitami\cgi-bin\mail\test.cgi line 17.
Execution of C:\Xitami\cgi-bin\mail\test.cgi aborted due to compilation errors.


Wie kann ich $text von &eins; an &zwei; übergeben?

Bearbeitet von Crian: CODE-Tags hinzugefügt\n\n

<!--EDIT|Crian|1063275542-->
Ishka
 2003-09-11 02:54
#50297 #50297
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
#!/usr/bin/perl -T

use CGI::Carp qw(fatalsToBrowser);
use strict; # das möchte ich haben
my $conttype = "Content-type: text/html\n\n";

zwei(eins());

sub eins{
return "This is a test!";
}

sub zwei{
print $conttype;
print $_[0];
}
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
xman
 2003-09-11 03:50
#50298 #50298
User since
2003-09-11
4 Artikel
BenutzerIn
[default_avatar]
In der &eins; habe ich %hash, @array und möchte diese Werte in verschiedenen Subs (ist auch der Sinn von Subs) weiter verwenden.

Ohne "use strict" geht es prima, da ich diese hashes und arrays auch global benutzen kann. Wie kann ich sie auch mit "use strict" ohne Fehler benutzen?

Hier ist der Auszug aus dem eigentlichen Programmcode:

Code: (dl )
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
########### Read files #################################################
sub read_files{
######### Read inputs file
open(DH, "<$inputs") or die "Cannot open $inputs! $!";
my @fields = <DH>;
close (DH);

######### Read style file
open(DH, "<$style") or die "Cannot open $style! $!";
my $css;
while(<DH>){
$css .= $_;
}
close(DH);

######### Read language file
my %fpmlang;
open(DH, "<$language") or die "Cannot open $language! $!";
my @temp = <DH>;
close(DH);
foreach(@temp){
chomp $_;
my @pair = split(/<==>/, $_);
$fpmlang{$pair[0]} = $pair[1];
}

######### Read skin file
my %fpmskin;
open(DH, "<$skin") or die "Cannot open $skin! $!";
my @temp = <DH>;
close(DH);
foreach(@temp){
chomp $_;
my @pair = split(/<==>/, $_);
$fpmskin{$pair[0]} = $pair[1];
}
######### Read secure file
open(DH, "<$secure") or die "Cannot open $secure! $!";

close(DH);

######### Read config file
my %fpmconfig;
open(DH, "<$config") or die "Cannot open $config! $!";
my @temp = <DH>;
close(DH);
foreach(@temp){
chomp $_;
my @pair = split(/<==>/, $_);
$fpmconfig{$pair[0]} = $pair[1];
}
}
########### Form #######################################################
sub form{
&read_files;
print $conttype;
print @fields;
print $fpmconfig{'BLABLA'};
print $fpmskin{'BLABLA'};
}


Bearbeitet von Crian: CODE-Tags hinzugefügt\n\n

<!--EDIT|Crian|1063275679-->
Ishka
 2003-09-11 04:44
#50299 #50299
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Entweder machst du die Variablen global, oder du übergibst sie.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use strict;
use warnings;

my $globalvar='';

sub in
{
$globalvar='Hallo';
}

soub out
{
print $globalvar;
}

in();
out();


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sub in
{
my $skalar=hallo;
my @array=(1,2,3);
my %hash=(a=>2,b=>3);
return (\$skalar,\@array,\%hash);
}

sub out
{
print $$_[0];
print "$_\n" for @$_[1];
print "$_=>$_[2]->{$_}\n" for keys %$_[2]:
}

my @refs=in();
out(@refs);
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Dubu
 2003-09-11 09:55
#50300 #50300
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Wobei die Uebergabe als Parameter wesentlich sauberer ist.
pq
 2003-09-11 12:51
#50301 #50301
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=xman,11.09.2003, 01:50]In der &eins; habe ich %hash, @array und möchte diese Werte in verschiedenen Subs (ist auch der Sinn von Subs) weiter verwenden.[/quote]
sicher ist der sinn von subs, Daten zu teilen, aber nicht Variablen.
subroutinen haben parameter und rückgabewerte, durch die man alle daten,
die man braucht, übergeben kann.
evtl. magst du dir perlintro mal durchlesen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2003-09-11 14:22
#50302 #50302
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
xman, Du solltest Dir eine saubere Einrückung des Quellcodes angewöhnen, Lesetipp: perlstyle - da wird Dir u.a. auch die Eirückung nahegelegt.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
xman
 2003-09-11 20:34
#50303 #50303
User since
2003-09-11
4 Artikel
BenutzerIn
[default_avatar]
[quote=Crian,11.Sep..2003, 12:22]xman, Du solltest Dir eine saubere Einrückung des Quellcodes angewöhnen, Lesetipp: perlstyle - da wird Dir u.a. auch die Eirückung nahegelegt.[/quote]
@Crian: Danke für den Tipp! Ich hatte auch saubere Einrückung im Code, leider weden die Tabs vom Forum-Script entfernt, sodass Du es nicht sehen kannst.

@alle: Vielen Dank für die vielen und präzisen Erklärungen!
pq
 2003-09-11 20:59
#50304 #50304
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=xman,11.09.2003, 18:34]@Crian: Danke für den Tipp! Ich hatte auch saubere Einrückung im Code, leider weden die Tabs vom Forum-Script entfernt, sodass Du es nicht sehen kannst.[/quote]
die tabs werden vom forum schon berücksichtigt, aber dafür
musst du natürlich - da es code ist - auch das code-
tag verwenden...
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
Crian
 2003-09-11 22:32
#50305 #50305
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Das Code-Tag hab ich ja nachträglich hineineditiert, deshalb waren die Tabs vorher schon verschwunden.

Ich habe eine natürliche Abneigung gegen Tabs im Quellcode... früher mochte Speicherplatz ja noch ein Argument gewesen sein, aber jetzt machen die nur Probleme... deshalb de-tabbify ich auch immer Code von Kollegen, den ich in meine Programme einbaue. Komodo hat dankenswerter Weise diese Option direkt eingebaut, anderenfalls hätte ich mir auch leicht mit einem Perl-Programm behelfen können.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2003-09-11 02:32.