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

Suchen mit Array (Seite 2)

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
Ishka
 2004-03-02 16:15
#80461 #80461
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Weil wir auf dem alten Perl-Board (soweit ich mich erinnere) mal ne diskussion dazu hatten und wild rumgebenchmarkt haben und festgestellt haben, daß man mit index nicht wirklich viel gewinnt.

Manchmal sucht man auch erst nach nem festen String und stellt später fest, daß man dann doch ein flexibles Suchmuster haben will. Wenn man schon n RegEx hat, gehts schnell. Wenn da ne indx-Lösung steht, dann dauerts..

Außerdem find ich RegExes intuitiver.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
ptk
 2004-03-02 16:17
#80462 #80462
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Ich finde den Erklaerungsversuch gut. Ausserdem finde ich, dass man
Code: (dl )
if (/pattern/) { ... }
besser lesen kann als
Code: (dl )
if(index("pattern",$_)>-1) { ... }
, naemlich: "wenn pattern matcht dann ..." statt "wenn das erste Auftreten von pattern in $_ groesser als -1 ist dann ...". Und wenn ich die Parameter von index() im Beispiel vertauscht habe, ist das ein weiteres Argument gegen index() :-)

Disclaimer: ich benutze index(), wenn ich optimiere und es sich in Benchmarks als schneller als Regexps erweist.
Relais
 2004-03-02 16:25
#80463 #80463
User since
2003-08-06
2261 Artikel
ModeratorIn
[Homepage] [default_avatar]
@ptk: Kennst Du nicht die "Erste Regel des Optimierens"?:
Tu es nicht! Mach lieber etwas sinnvolleres in der Zeit, die Du hast.

Wie soviele Regeln gibt es noch mehr davon, und natürlich Ausnahmen. Optimieren bringt tatsächlich was: man lernt etwas dabei.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop 12. bis 14. Mai 2025 in München.

Winter is Coming
pq
 2004-03-02 16:51
#80464 #80464
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=ptk,02.03.2004, 15:17]Ich finde den Erklaerungsversuch gut. Ausserdem finde ich, dass man
Code: (dl )
if (/pattern/) { ... }
besser lesen kann als
Code: (dl )
if(index("pattern",$_)>-1) { ... }
, naemlich: "wenn pattern matcht dann ..." statt "wenn das erste Auftreten von pattern in $_ groesser als -1 ist dann ...".[/quote]
aber nehmen wir mal an, das pattern steht in der variable $pattern. dann
hast du mit /$pattern/ ein problem, dass viele anfänger haben - nämlich
sonderzeichen, die evtl. in $pattern auftauchen, z.B. ein punkt, der aber
wirklich auf einen punkt matchen soll => also /\Q$pattern\E/
deswegen finde ich persönlich es intuitiver, index() zu verwenden (ok, das mit
-1 ist wirklich perl-untypisch unschön), anstatt /\Q$pattern\E/.
abgesehen davon ist aber beim problem des OP eine regex wohl eh angebrachter,
da es sich ja um mehrere strings handelt.
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
Crian
 2004-03-04 10:47
#80465 #80465
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=kabel,02.03.2004, 10:16]ich muss mich korrigieren:

Code: (dl )
1
2
3
my $re_as_str = join "|", @havis_array;
my $re = qw/$re_as_str/;
if ($blankname =~ $re) { ... }


da sollte natürlich stehen:

Quote
my $re = qr/$re_as_str/;
[/quote]
Wenn Du Havis Array mit dem Pipesymbol zusammenjoinst, dann fehlt außen drum ja noch der eigentliche RE-Teil "m~...~".

Ich kannte qr bisher nicht, in meiner Tabelle in Perl 5 kurz und gut steht:

Üblich: ""
Generisch: qr//
Bedeutung: Regulärer Ausdruck

Ich versteh irgendwie nicht, wie Dein if-Aufruf weiß, dass dort m// verwendet werden soll.

Irgendwie steh ich gerade auf dem Schlauch.


Ich hätte das wahrscheinlich in einen String gepackt mit RE-Rahmen und den dann mit eval ausgeführt, aber wenn man eval vermeiden kann, ist das eigentlich immer von Vorteil. Und hier schaut mich gerade ein Puzzelsteinchen an, das mir zu meinem mosaikartigen Perlwissen fehlt ;)
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
pq
 2004-03-04 11:26
#80466 #80466
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Crian,04.03.2004, 09:47]Ich versteh irgendwie nicht, wie Dein if-Aufruf weiß, dass dort m// verwendet werden soll.[/quote]
$re = qr/.../;
$re ist hier sozusagen ein objekt vom typ 'Regexp'. (intern ist es vielleicht
etwas anders implementiert, aber es verhält sich so).
"" ist überladen und =~, so dass, wenn =~ auf das object angewendet wird,
der operator bescheid weiss, dass es eine regex sein soll.
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
Crian
 2004-03-04 12:41
#80467 #80467
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Aha. Aber es ist dann auf jedenfall eine Suche (m//) und kein ersetzen (s///), oder?

Ich könnte dann also auch schreiben

if ($var =~ "^\d+$") {...}

oder

if ($var =~ "^[a-z]+$"i) {...}

?

(bitte nicht über Sinn/Unsinn der Beispiel-RE's diskutieren ;-)

Muss ich gleich mal ausprobieren.
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-03-04 12:45
#80468 #80468
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Nö:

Code: (dl )
1
2
3
my $var = "123";

if ($var =~ "^\d+$") { print "jau\n"; }


liefert:

Code: (dl )
1
2
3
4
Unrecognized escape \d passed through at C:\Daten\perl\forum\qr.pl line 3.
Final $ should be \$ or $name at C:\Daten\perl\forum\qr.pl line 3, within string
syntax error at C:\Daten\perl\forum\qr.pl line 3, near "=~ "^\d+$""
Execution of C:\Daten\perl\forum\qr.pl aborted due to compilation errors.


Aber

Code: (dl )
1
2
3
4
my $var = "123";

my $re = qr/^\d+$/;
if ($var =~ $re) { print "jau\n"; }


funktioniert wunderbar.

Allerdings keine Variante mit "..."?\n\n

<!--EDIT|Crian|1078398193-->
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
pq
 2004-03-04 14:00
#80469 #80469
User since
2003-08-04
12209 Artikel
Admin1
[Homepage]
user image
[quote=Crian,04.03.2004, 11:41]Aha. Aber es ist dann auf jedenfall eine Suche (m//) und kein ersetzen (s///), oder?
[/quote]
ja, da es mit m// und nicht mit s/// überladen wurde...
Quote
Ich könnte dann also auch schreiben

if ($var =~ "^\d+$") {...}

nein, denn ein string ist halt kein objekt der klasse Regexp...

edit:
aber auch das geht; das hatte ich ganz vergessen.
du musst die regex in single quotes schreiben. in deiner
variante wird halt erst \d umgewandelt, und \d gibt es
in double quotes eigentlich nicht, deswegen weiss perl damit
nichts anzufangen.\n\n

<!--EDIT|pq|1078401808-->
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
Strat
 2004-03-04 20:31
#80470 #80470
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
also ich verwende &reg;index fuer die suche nach fixen zeichenketten in groesseren zeichenketten, wenn mich die position interessiert, und haeufig auch, wenn mich die position nicht interessiert. ob es generell schneller oder langsamer ist, interessiert mich da in der regel sehr wenig, weil es in der regel schnell genug ist
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2004-03-02 10:00.