Schrift
[thread]6399[/thread]

substr_count in perl (Seite 2)



<< |< 1 2 3 >| >> 30 Einträge, 3 Seiten
Crian
 2004-07-14 17:51
#84298 #84298
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich vermute mal ganz wild, nicht schlagen wenn es Unsinn ist: An der fraglichen Stelle handelt es sich um ein Array und keine Liste. Die Liste () zwingt die Rückgabe in Listenkontext, die Rückgabe selbst ist aber ein Array. Ne Quatsch wie soll sie das sein? Hmmm versteh ich auch nicht.
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
Crian
 2004-07-14 17:55
#84299 #84299
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=betterworld,14.07.2004, 15:45]
Code: (dl )
1
2
my $x=("warner","brosers");
print $x; # warner
[/quote]
Nö:

Code: (dl )
1
2
my $x = ("warner","brosers");
print "$x\n"; # warner


Ausgabe:

Code: (dl )
1
2
Useless use of a constant in void context at C:\Daten\perl\forum\listen_und_arrays.pl line 1.
brosers


!

Aber:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
my $w = "warner", "brosers";
print "w: $w\n";

my $x = ("warner","brosers");
print "x: $x\n";

my ($y) = ("warner","brosers");
print "y: $y\n";

my $z = @{ ["warner","brosers"] };
print "z: $z\n";

my $a = () = ("warner","brosers");
print "a: $a\n";

my $b = () = @{ ["warner","brosers"] };
print "b: $b\n";

my ($c) = () = ("warner","brosers");
print "c: $c\n";


Ausgabe:

Code: (dl )
1
2
3
4
5
6
7
8
9
Useless use of a constant in void context at C:\Daten\perl\forum\listen_und_arrays.pl line 4.
Useless use of a constant in void context at C:\Daten\perl\forum\listen_und_arrays.pl line 1.
w: warner
x: brosers
y: warner
z: 2
a: 2
b: 2
c:


Erklärungsansatz:

Fall w: Kommaoperator, $w wird "warner" zugewiesen, "brosers" ist nur leere Anweisung, deshalb die Warnung.

Fall x: Die Klammer fasst nur den Kommaoperator zusammen, deshalb wird der letzte Wert zurückgegeben und es kommt die Warnung, da "warner" eine leere Anweisung ist. ?-?-?

Fall y: Im Listenkontext kommt der erste Wert der Liste zurück.\n\n

<!--EDIT|Crian|1089814558-->
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
Taulmarill
 2004-07-14 18:08
#84300 #84300
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Code: (dl )
my $x=("warner","brosers"); # $x == "brosers"


@crain: das is kein syntax fehler sonder ne warnung, kommt also nur mit -w bzw. use warnings;
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-07-14 18:12
#84301 #84301
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Ich hab das Programm genau so abgeschickt wie es da steht, allerdings aus Komodo heraus. Keine Ahnung, ob der da noch -w setzt.

Wichtig ist, dass nicht der erste, sondern der letzte Wert dabei rauskommt.

Lies mein Posting oben nochmal, ich hab zuende ausgeführt, was ich meinte.\n\n

<!--EDIT|Crian|1089814627-->
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
betterworld
 2004-07-14 18:27
#84302 #84302
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
[quote=Taulmarill,14.07.2004, 16:08]
Code: (dl )
my $x=("warner","brosers"); # $x == "brosers"
[/quote]
Ja, sorry, es ist natuerlich "brosers" und nicht "warner", aber ich wollte betonen, dass es nicht "2" ist.
betterworld
 2004-07-14 18:36
#84303 #84303
User since
2003-08-21
2613 Artikel
ModeratorIn

user image
Crians warning finde auch ich nicht weiter verwunderlich. Die wirkliche Frage ist, wo hier der Array ist. Ich vermute einfach mal, dass dies ein magisches syntaktisches Candy ist, das von den Perl-Entwicklern eingebaut wurde, damit es dem Programmierer leichter ist, eine Liste in ein Array zu verwandeln und dann im skalaren Kontext zu behandeln.
Taulmarill
 2004-07-14 18:45
#84304 #84304
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
naja, nicht ganz,

(nicht hauen wenn das folgende falsch ist):
("warner","brosers") ist eine liste von konstanten.
() ist ein anonymes array, welchesnicht optimiert wird

interessant finde ich folgendes
Code: (dl )
1
2
3
4
perl -MO=Deparse -e'$foo = qw/a b c d/;print $foo;'
$foo = ('???', '???', '???', 'd');
print $foo;
-e syntax OK

aber
Code: (dl )
1
2
3
4
perl -MO=Deparse -e'$foo =()= qw/a b c d/;print $foo;'
$foo = () = ('a', 'b', 'c', 'd');
print $foo;
-e syntax OK


listen auf der rechten seite der gleichheitszeichen scheinen je nach kontext (liste oder scalar) optimiert zu werden.\n\n

<!--EDIT|Taulmarill|1089816385-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
sri
 2004-07-14 19:00
#84305 #84305
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Also ich werde der ganzen Sache mal ein Ende machen. :)

-----------------SPOILER-------------------------------------

Arrays und Listen sind ganz unterschiedliche Dinge, Arrays sind ein Datentyp, Listen ein Kontext.

Auf Arrays könne operationen wie push, pop, delete, shift etc. angewendet werden, auf Listen nicht.

Code: (dl )
$scalar = ('lala', 'foo', 'bar');

Ihr denkt das ist eine Liste? FALSCH!
Hier wird der Komma operator im scalar Kontext benutzt, also wird der letzte Wert in der Reihe zurückgegeben, es gab nie wirklich eine Liste! :)

Code: (dl )
$scalar = () = ('lala', 'foo', 'bar');

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. ;)
Taulmarill
 2004-07-14 19:23
#84306 #84306
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
also hatte ich mit
Quote
listen auf der rechten seite der gleichheitszeichen scheinen je nach kontext (liste oder scalar) optimiert zu werden.

eigendlich doch recht :D
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-07-14 19:30
#84307 #84307
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
@sri: stimmt doch mit dem überein, was ich weiter oben gesagt habe (zu den Fällen x und y)
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 3 >| >> 30 Einträge, 3 Seiten



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