Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10115[/thread]

Variable verliert ihren Wert



<< >> 6 Einträge, 1 Seite
RalphFFM
 2007-08-17 17:05
#98332 #98332
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wieso ist $var in der Subroutine undef?
Ich weiß es gerade wirklich nicht.
Ich bitte Euch um Hilfe, im voraus Danke!

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use warnings; use strict;

my %myhash; my $var; # <- $var soll global sein!
$myhash{'foo'} = "bar";

foreach $var (keys %myhash) {
&mysub;
}

sub mysub {
print "$var\n"; # <-- Wieso undef?
}
GwenDragon
 2007-08-17 17:16
#98333 #98333
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
$var ist undef, weil du ihr nichts zugeweisen hast.
Deine Subroutine liest ja aus der $var aus, die du vorher mit
my $var definiert hast.

Wenn du $var auch der foreach-Schleife auslesen willst, musst du sie auch an die Subroutine übergeben.

Also
Code: (dl )
subroutine($variable);

Und in der sub

Code: (dl )
1
2
3
4
5
sub subroutine {
my $arg = shift;

print "$arg\n";
}
RalphFFM
 2007-08-17 17:20
#98334 #98334
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Aber in der foreach-Schleife ist $var="foo" !
Also ist dort doch eine Zuweisung erfolgt?
Erst danach wird mysub aufgerufen.
Ronnie
 2007-08-17 17:20
#98335 #98335
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
$var wird anscheinend "magisch" local durch foreach:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings; 

my %myhash; 
my $var = "qiz";  # <- $var soll global sein!

$myhash{'foo'} = "bar";

foreach $var (keys %myhash) {
    print $var;
    mysub();
}

sub mysub {
    print "$var\n";  # <-- Wieso undef?
}

Das Verhalten lässt sich aber durch die Verwendung von our verhindern, dann geht es wie gewünscht. Genauer erklären wie dieses Verhalten zustande kommt kann ich aber leider nicht.
Gast Gast
 2007-08-17 17:31
#98336 #98336
Einfach so:

our $var = undef;

Damit ist $var im ganzen Paket sichtbar. Ansonsten ist $var nur ausserhalb von sub sichtbar.
Gast Gast
 2007-08-17 17:35
#98337 #98337
<< >> 6 Einträge, 1 Seite



View all threads created 2007-08-17 17:05.