Schrift
[thread]7129[/thread]

mal wieder was mit grep

Leser: 1


<< >> 8 Einträge, 1 Seite
mordur
 2005-07-12 11:57
#56353 #56353
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
moins,

ich habe ein muster und einen String (Arrayelement).
Ich möchte vergleichen, ob der String im Muster vorkommt.
Aber grep findet irgendwie zuviel.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
my $muster ="1-5-4-bla2-sles8";
my @array =("i486-glibc22-linux","sles8");

foreach(@array)
{
my $element = $_;
if(grep (/$element/,$muster ))
{
print "$element gefunden in $muster\n";
last;
}
else {
print " nicht gefunden \n";
}
}


bereits das erste Element "i486-glibc22-linux" wird im Muster angeblich gefunden, obwohl es nicht drin ist, ausser in "Einzelteilen" wie "b" oder "2". Ich möchte jedoch das die Elemente des Arrays in Ihrer ganzen Länge exakt im Muster passen sollen. Element "sles8" sollte hier den Treffer bringen.
Relais
 2005-07-12 12:05
#56354 #56354
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dein "sollte" ist bei mir erfüllt, der Fehler passiert nicht:
Dein Code läuft bei mir (perl, v5.8.6 built for i686-linux) einwandfrei.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
J-jayz-Z
 2005-07-12 12:10
#56355 #56355
User since
2005-04-13
625 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja, ist ja auch klar. sles8 beispielsweise ist ja auch nur ein Teil des Musters. Ich würde das so schreiben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
my @array =("i486-glibc22-linux", "sles8");

foreach(@array)
    {
      if(/^(1|5|4|bla2|sles8)$/)
      {
      print "$_ gefunden in (1|5|4||bla2|sles8)\n";
      last;
   }
else {
print " nicht gefunden \n";
}
}            

Wenn du das meinst\n\n

<!--EDIT|J-jayz-Z|1121155861-->
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="5065726c2d436f6d6d756e697479"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

http://perl-tutor.de
mordur
 2005-07-12 12:11
#56356 #56356
User since
2003-09-25
182 Artikel
BenutzerIn
[Homepage] [default_avatar]
@relais ..hm stimmt , war wohl mein logischer fehler.
ich hatte nämlich zuerst
Code: (dl )
 if(grep /$_/, $muster) 
da stehen. Wobei ich meinte, $_ wäre das aktuelle Arrayelement. Aber denkste...
renee
 2005-07-12 12:12
#56357 #56357
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Warum machst Du es nicht so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
my $muster ="1-5-4-bla2-sles8";
my @array =("i486-glibc22-linux","sles8");

foreach my $element(@array) {
if($muster =~ /$element/) {
# oder
# if(index($muster,$element) != -1){
print "$element gefunden in $muster\n";
last;
}
else {
print " nicht gefunden \n";
}
}


Du kannst gleich im Schleifenkopf $element mit dem aktuellen Wert belegen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2005-07-12 12:14
#56358 #56358
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=mordur,12.07.2005, 10:11]@relais ..hm stimmt , war wohl mein logischer fehler.
ich hatte nämlich zuerst
Code: (dl )
 if(grep /$_/, $muster) 
da stehen. Wobei ich meinte, $_ wäre das aktuelle Arrayelement. Aber denkste...[/quote]
Es ist das aktuelle Listenelement innerhalb von grep. Deine Liste bei grep hat allerdings nur einen Wert!

Dadurch ist der "Fehler", den Du beschrieben hast auch zu erklären. Jede Zeichenfolge ist in sich selbst enthalten...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Taulmarill
 2005-07-12 12:39
#56359 #56359
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
wenn man nur die treffer-elemente haben will, reicht auch ein einfaches grep:
Code: (dl )
1
2
3
4
5
6
my $muster   = '1-5-4-bla2-sles8';
my @elements = qw/i486-glibc22-linux sles8 0815 5-4 foo/;
my @found = grep { $muster =~ /$_/ } @elements;

print 'Die Elemente ' . join(', ',@found);
print " wurden in dem Muster $muster gefunden.\n"
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
pKai
 2005-07-12 15:59
#56360 #56360
User since
2005-02-18
357 Artikel
BenutzerIn
[default_avatar]
Erwähnenswert ist IMHO in diesem Zusammenhang noch, dass in all diesen Codezeilen die Muster tatsächlich Muster sind, d. h. evtl. vorhandene RegEx-Metazeichen würden auch als solche behandelt. Wenn man im Vorfeld über die Musterherkunft wenig weiß, oder allgemein aus Vorsicht und nur Strings in anderen Strings suchen will, dann sollte man seinen "Muster"-Input durch
Code: (dl )
$element = quotemeta($_)

behandeln lassen, oder analog im m-Operator quoten:
Code: (dl )
$muster =~ /\Q$_\E/

oder auch mit index suchen:
Code: (dl )
index($muster, $_) >= 0
I sense a soul in search of answers.
<< >> 8 Einträge, 1 Seite



View all threads created 2005-07-12 11:57.