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

sub und for (1..@_)

Leser: 1


<< >> 5 Einträge, 1 Seite
toby
 2006-06-17 11:41
#67423 #67423
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo Perl-community :)

ich habe ein für mich seltsames Phenomän entdeckt und zwar, kann ich in einer for-schleife in einer sub-routine nicht mit "@_" arbeiten, obwohl diese Variable richtig übergeben wurde. Schaut Euch den code an:

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

use strict;
use warnings;

my $i=5;
&test($i);
sub test{
print "uebergeben an test: @_\n";
for(1..$i){ # hier kann ich $i gegen @_ nicht tauschen
print "\@_ in der for-schleife: @_\n";
print 'rechnen in der for-schleife: ',$_+$_,"\n";
}
}


Wie Ihr sieht, überprüfe ich "@_" ständig und ist wird an jeder Stelle auch richtig ausgegeben, trotzdem kann ich for( 1..$i ) nicht gegen for( 1..@_ ) tauschen, warum? Nach dem was ich alles über sub funktionen gelernt habe, sollte man ja möglichst auf "@_" zugreifen und es müsste funktionieren. Was ist hier falsch?

Danke für Eure Erklärungen! :)
Tobias
Ronnie
 2006-06-17 11:53
#67424 #67424
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Willst du eine Liste oder einen Skalar verarbeiten? @_ ist ein Array, du willst aber so wie es aussieht mit dessen Inhalt arbeiten. Hierzu kannst du z.B. shift verwenden um Elemente des Arrays @_ zu entnehmen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;

my $i=5;
&test($i);

sub test{
my $i = shift @_; # !!!
for(1..$i){
print "\@_ in der for-schleife: @_\n";
print 'rechnen in der for-schleife: ',$_+$_,"\n";
}
}

EDIT: Du könntest es alternativ z.B. auch so schreiben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/perl

use strict;
use warnings;

print for test(5);

sub test{
die unless @_;
return map { $_*2 . "\n" } (1..shift @_)
}
\n\n

<!--EDIT|Ronnie|1150531268-->
Linuxer
 2006-06-17 11:57
#67425 #67425
User since
2006-01-27
3890 Artikel
HausmeisterIn

user image
Code: (dl )
for ( 1 .. @_ ) {}


@_ wird hier im skalaren Kontext ausgewertet und es wird die Anzahl der Elemente geliefert. In Deinem Beispiel ist das: 1

Also wird Deine Schleife genau einmal durchlaufen; von 1 bis 1 ...

Wenn Du mit der in @_ enthaltenen 5 arbeiten willst, musst Du auf das erste Element des Array @_ zugreifen:

Code: (dl )
for ( 1 .. $_[0] ) {}


Empfohlene Dokumentation:
@_ : perlsub - description
Array im skalaren Kontext: perldata - List value constructors
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!
toby
 2006-06-17 12:09
#67426 #67426
User since
2006-04-14
66 Artikel
BenutzerIn
[default_avatar]
Hallo :)

Quote
@_ wird hier im skalaren Kontext ausgewertet und es wird die Anzahl der Elemente geliefert. In Deinem Beispiel ist das: 1


Oh, man.. vergessen! *schäm"

Danke schön!
Tobias
esskar
 2006-06-17 12:20
#67427 #67427
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
was auch geht
Code: (dl )
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/perl

use strict;
use warnings;

my $i=5;
&test($i);
sub test{
print 'rechnen in der for-schleife: ',$_+$_,"\n" for(1..shift);
}
<< >> 5 Einträge, 1 Seite



View all threads created 2006-06-17 11:41.