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

substr_count in perl (Seite 3)



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
pq
 2004-07-14 20:14
#84308 #84308
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
nein, es ist hier meiner meinung nach kein anonymes array im spiel. es gibt array-referenzen,
also etwa [], was eine referenz auf ein anonymes array ist.
() ist einfach eine liste, und ich bin derselben
meinung wie betterworld, dass das hier
unlogisch erscheint und syntactic sugar ist.
[quote=sri,14.07.2004, 17:0]Ja, hier haben wir eine Liste, weil im richtigen Kontext wird es intern als anonymes Array behandelt und gibt dann im scalar Kontext die Anzahl seiner Elemente zurück.[/quote]
so in etwa dachte ich mir das auch, aber es
ist unlogisch, weil es nicht dem normalen
verhalten von perl gleicht.
$scalar = qw(a b c);
hier ist z.b. niemals eine liste im spiel. perl
erkennt schon vor der zuweisung, dass es
sich um einen skalaren kontext handelt;
somit haben die beiden ersten elemente
void kontext und es wird nur das letzte element
zurückgegeben.
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
pq
 2004-07-14 20:41
#84309 #84309
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
jetzt habe ich doch die richtige stelle in perldata gefunden:
      List assignment in scalar context returns the number of
      elements produced by the expression on the right side of
      the assignment:

          $x = (($foo,$bar) = (3,2,1));       # set $x to 3, not 2
          $x = (($foo,$bar) = f());           # set $x to f()'s return count

      This is handy when you want to do a list assignment in a
      Boolean context, because most list functions return a null
      list when finished, which when assigned produces a 0,
      which is interpreted as FALSE.
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
betterworld
 2004-07-15 00:14
#84310 #84310
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Ja, das ist echt praktisch. Wieder dazugelernt.
sri
 2004-07-15 18:43
#84311 #84311
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=pq,14.07.2004, 18:14]nein, es ist hier meiner meinung nach kein anonymes array im spiel. es gibt array-referenzen,
also etwa [], was eine referenz auf ein anonymes array ist.
() ist einfach eine liste, und ich bin derselben
meinung wie betterworld, dass das hier
unlogisch erscheint und syntactic sugar ist.
[quote=sri,14.07.2004, 17:0]Ja, hier haben wir eine Liste, weil im richtigen Kontext wird es intern als anonymes Array behandelt und gibt dann im scalar Kontext die Anzahl seiner Elemente zurück.[/quote]
so in etwa dachte ich mir das auch, aber es
ist unlogisch, weil es nicht dem normalen
verhalten von perl gleicht.
$scalar = qw(a b c);
hier ist z.b. niemals eine liste im spiel. perl
erkennt schon vor der zuweisung, dass es
sich um einen skalaren kontext handelt;
somit haben die beiden ersten elemente
void kontext und es wird nur das letzte element
zurückgegeben.[/quote]
Es geht mir auch nicht um logik sondern darum wie Perl es intern verarbeitet.

Code: (dl )
my $count = () = qw(a b c);


Ich kann es leider nicht mehr finden, aber ich meine das da in diesem Fall etwas von einem newAVREF im perly.y stand, kann mir nämlich nicht vorstellen das die Werte der anonymen liste als konstanten auf dem Stack landen, schliesslich ist folgendes ja auch möglich.

Code: (dl )
my $count = @list = qw(a b c);


Wenn ichs wiederfinde poste ichs...
betterworld
 2004-07-15 19:48
#84312 #84312
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=sri,15.07.2004, 16:43]
Code: (dl )
my $count = () = qw(a b c);


Code: (dl )
my $count = @list = qw(a b c);
[/quote]
Im ersten Fall ist es eine Listenzuweisung, im zweiten Fall ist es eine Array-Zuweisung. Die Listenzuweisung gibt (im skalaren Kontext) die Anzahl der Elemente rechts zurueck (wie im von pq zitierten Text steht). Die Array-Zuweisung gibt die Liste als Array zurueck, und wenn das dann im skalaren Kontext steht, wird die Anzahl der Elemente zurueckgegeben, was effektiv dasselbe ist wie im ersten Fall.

Ich finde das jetzt gar nicht mehr unlogisch.

Ich stimme Dir uebrigens nicht ganz zu bei dem, was Du weiter oben geschrieben hast. Eine Liste ist nicht "nur" ein Kontext, sondern auch ein Ding. Du hast wohl Recht, indem Du sagst, dass wir in Wirklichkeit den Komma-Operator benutzt haben und es "Liste" genannt haben. Ein besseres Beispiel waere gewesen:
Code: (dl )
1
2
3
4
sub ich_gebe_eine_liste { return "warner", "brosers"; }
my $scalar = ich_gebe_eine_liste;
print $scalar."\n"; # brosers
print ich_gebe_eine_liste,"\n"; # warnerbrosers

Hierbei handelt es sich in der Tat um eine Liste und nicht um den Komma-Operator, denn eine Subroutine gibt immer eine Liste zurueck.

So, nun haben wir das wohl genug durchgekaut. Ich hoffe, dass norman nicht zu irritiert ist und wir ihm eine Loesung fuer sein Problem bieten konnten.
sri
 2004-07-15 20:41
#84313 #84313
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=betterworld,15.07.2004, 17:48][quote=sri,15.07.2004, 16:43]
Code: (dl )
my $count = () = qw(a b c);


Code: (dl )
my $count = @list = qw(a b c);
[/quote]
Im ersten Fall ist es eine Listenzuweisung, im zweiten Fall ist es eine Array-Zuweisung. Die Listenzuweisung gibt (im skalaren Kontext) die Anzahl der Elemente rechts zurueck (wie im von pq zitierten Text steht). Die Array-Zuweisung gibt die Liste als Array zurueck, und wenn das dann im skalaren Kontext steht, wird die Anzahl der Elemente zurueckgegeben, was effektiv dasselbe ist wie im ersten Fall.
[/quote]

Das ist doch alles schon klar! ;)

Es ging darum ob es syntaktischer Zucker oder ein logisches Feature ist.
Ich bin der Meinung das es logisch ist weil die Listenzuweisung intern als AV gespeichert wird, kann es nur noch nicht beweisen weil ich die richtigen Stellen im Parser nicht finde.

[quote=betterworld,15.07.2004, 17:48]
Ich stimme Dir uebrigens nicht ganz zu bei dem, was Du weiter oben geschrieben hast. Eine Liste ist nicht "nur" ein Kontext, sondern auch ein Ding.
[/quote]
Was soll denn bitte ein Ding sein? :)
betterworld
 2004-07-18 17:15
#84314 #84314
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=sri,15.07.2004, 18:41]Ich bin der Meinung das es logisch ist weil die Listenzuweisung intern als AV gespeichert wird, kann es nur noch nicht beweisen weil ich die richtigen Stellen im Parser nicht finde.[/quote]
Da Du Dich ja anscheinend mit dem Parser auskennst, habe ich mal eine Frage: Als ich mich naemlich aufmachte, die von Dir beschriebene Stelle zu finden, wunderte mich folgendes in op.c:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
OP *
Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
{
OP *o;

if (optype) {
/* .... */
return irgendwas;
}
/* ganz viele Zeilen */
}

Denn so weit ich das sehe, wird als drittes Argument an diese Funktion immer ein wahrer Wert uebergeben. Daher werden die ganz vielen Zeilen unter der if-Anweisung aber doch gar nicht erreicht! Was habe ich da uebersehen?

danke, betterworld

(das war jetzt aus perl-5.8.0)\n\n

<!--EDIT|betterworld|1090157876-->
sri
 2004-07-18 19:34
#84315 #84315
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
[quote=betterworld,18.07.2004, 15:15]Denn so weit ich das sehe, wird als drittes Argument an diese Funktion immer ein wahrer Wert uebergeben. Daher werden die ganz vielen Zeilen unter der if-Anweisung aber doch gar nicht erreicht! Was habe ich da uebersehen?[/quote]
Bin zwar nicht wirklich ein Experte für Perl5 aber das weiss ich! :)

Also im Normalfall ist optype gesetzt, aber wenn bestimmmte Ausnahmen auftreten (rechter op ist undef, rechter op ist readline, linker op ist listenzuweisung) bleibt optype leer weil weitere Vorbereitungen erforderlich sind.

Is doch auch ganz einfach aus den anderen if Blöcke zu erkennen? :)

Aber schön das sich langsam mehr Leute an die Quelltexte trauen!

Kleiner tip: Unbedingt perldoc perlhack lesen!
betterworld
 2004-07-24 19:51
#84316 #84316
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
[quote=betterworld,15.07.2004, 17:48]denn eine Subroutine gibt immer eine Liste zurueck.[/quote]
Das stimmt natuerlich nicht. Da die sub im skalaren Kontext aufgerufen wurde, steht auch der return-Ausdruck im skalaren Kontext.

Naja, trotzdem koennte man ein Beispiel konstruieren, das demonstriert, was ich demonstrienen wollte, aber ich habe gerade keine Lust dazu.\n\n

<!--EDIT|betterworld|1090684384-->
pq
 2004-07-24 19:59
#84317 #84317
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=betterworld,24.07.2004, 17:51]
Das stimmt natuerlich nicht. Da die sub im skalaren Kontext aufgerufen wurde, steht auch der return-Ausdruck im skalaren Kontext.
[/quote]
naja, aber im prinzip stimmt das ja doch. eine subroutine gibt immer eine
liste zurück (ausser im void-kontext natürlich). diese liste kann ja leer
sein oder nur ein element haben. der kontext ist was anderes.
aber das ist alles mehr oder weniger definitionssache, meistens werden
solche diskussion irgendwann sinnlos, da jeder das richtige meint, aber es
anders ausdrückt =)
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
<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten



View all threads created 2004-07-14 14:52.