Thread shifting trouble: shift's Rückgabewert ändert sich durch (10 answers)
Opened by dukeofnukem at 2007-01-15 15:08

dukeofnukem
 2007-01-15 15:08
#73210 #73210
User since
2007-01-15
47 Artikel
BenutzerIn
[default_avatar]
Alohá!

Sieht gut aus hier, grade registriert weil ich einfach keine Idee habe wie folgendes zu Stande kommt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
# Get fh
sub get_fh {
print "\nARRAY IS: ", join (' ', @_);
my $class = shift;
print "\nARRAY IS: ", join (' ', @_);
my $file = shift or croak "specify file!\n";
print "\nARRAY IS: ", join (' ', @_);
my $option = shift or my $option = "dummy";
$file = abs_path($file) unless ( $file eq "tmpfile" );
print "\n FILE IS: ", $file;
print "\n OPTION IS: ", $option;


Wenn ich die Methode mit z.B. mit
Code: (dl )
$class->get_fh("/path/to/file", "write");

aufrufe, bleibt $option uninitialized!

Die Ausgabe gibt mir durchaus die korrekte Befüllung von @_ an, und die ersten beiden Parameter werden sauber runtergeshifted, doch wenn es an den letzten geht (bzw. die or-Bedingung evaluiert wird), klappts nicht.

Wenn ich die Überprüfung rausnehme und stumpf shifte ist alles wunderbar (bis auf die Tatsache daß ich keinen default-init auf $option machen kann).

Selbst wenn ich alternative checks auf Vorhandensein des dritten array-felds nutze wirft das alles über den Haufen:
Code: (dl )
   defined(\$_[0]) ? my $option = shift : my $option = "dummy";

sorgt für die gleiche Problematik: es wird weder mit "dummy" initialisiert noch der vorhandene Parameter geshifted und $option zugewiesen.

Bin auch mit perl -d durchgesteppt:
- das Übergabearray ist korrekt befüllt
- bei einfachem shift wird korrekt zugewiesen
- bei Überprüfung auf Existenz oder Rückgabwert von shift bleibt $option uninitialisiert

Das Problem muß tatsächlich mit der Überprüfung der Befüllung von $option zu tun zu haben; wenn ich folgendes mache
Code: (dl )
1
2
   my $option = shift;
my $option = "dummy" unless $option;

und mit perl -d durchsteppe, wird $option korrekt initialisiert doch durch die nächste Zeile wieder auf undef gesetzt.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
  DB<14> x $option
0 undef
DB<15> s
Fileclerk::get_fh(<laanger/path/to/File.pm>:65):
65: my $option = "dummy" unless ($option);
DB<15> x $option
0 'write'
DB<16> s
Fileclerk::get_fh(<laanger/path/to/File.pm>:66):
66: $file = abs_path($file) unless ( $file eq "tmpfile" );
DB<16> x $option
0 undef
DB<17>



Hab ich da was komplett falsch verstanden was die Überprüfung der initialisierung von Variablen angeht?

Wer kann das Rätsel lösen? :-)

TIA

DoN
drum&bass is a state of mind

View full thread shifting trouble: shift's Rückgabewert ändert sich durch