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

Wörter im Array zählen

Leser: 2


<< >> 5 Einträge, 1 Seite
wiederlader
 2008-02-19 15:34
#106102 #106102
User since
2007-01-03
36 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen,

da ich längere Zeit mal wieder nichts mit Perl gemacht habe, stehe ich mal wieder vor einem Problem und bekomme es nicht gelöst. Ich möchte in einer Datei/List (die ich in ein Array lade) nach bestimmten Namen suchen und zusätzlich Ausgeben wie oft der Name in der Datei vorhanden ist. Das mit dem Filehandel und so weiter ist mir schon klar, nur ich komme einfach nicht drauf, wie ich die Anzahl eines Wortes (Namen) aus einem Array ermittlen kann.

Folgend mein Script welches ausgibt ob der gesuchte Name vorhanden ist oder nicht. Zusätzlich soll aber auch ausgegeben werden wie oft der Name in dem Array vorhanden ist.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!perl -w
use strict;
use warnings;

my @vorname;
my $vorname;
$vorname[0]= "Markus";
$vorname[1]= "Fritz";
$vorname[2]= "Otto";

my @liste;
my $liste;
$liste[0]= "Fritz";
$liste[1]= "Otto";
$liste[2]= "Fritz";
$liste[3]= "Josef";

my $zaehler = 0;

foreach (@vorname) {
         if ("@liste" =~ "$_")  {
         print "Der Vorname <<< $_ >>> ist vorhanden\n";
         }
         else   {
         print "Der Vorname <<< $_ >>> ist nicht vorhanden\n";
         }
  }


Mein Script gibt ja aktuell folgendes aus:

Der Vorname <<< Markus >>> ist nicht vorhanden
Der Vorname <<< Fritz >>> ist vorhanden
Der Vorname <<< Otto >>> ist vorhanden

Und da wo der Vorname vorhanden ist, soll "ist X Mal vorhanden" stehen.
Wie kann ich in meiner foreach Schleife zusätzlich die Anzahl ermitteln sofern der Vorname vorhanden ist ?
DANKE
Gruß
Markus
murphy
 2008-02-19 15:42
#106103 #106103
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Ich würde es so versuchen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
use 5.010;
use strict;
use warnings;

my @names = qw/Markus Fritz Otto/;

my @candidates = <>;
chomp @candidates;

foreach my $name (@names) {
  my $count = scalar grep /\Q$name\E/, @candidates;
  say "'$name' encountered $count times";
}

When C++ is your hammer, every problem looks like your thumb.
renee
 2008-02-19 15:42
#106104 #106104
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
for my $name (@vorname) {
        my $anz = grep{ $_ eq $name } @liste;
         if ( $anz ){
             print "Der Vorname <<< $name >>> ist $anz Mal vorhanden\n";
         }
         else   {
             print "Der Vorname <<< $name >>> ist nicht vorhanden\n";
         }
  }
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/
pq
 2008-02-19 15:49
#106105 #106105
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
es geht auch mit nur einer schleife:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
use Data::Dumper;
my @vorname = qw/ Markus Fritz Otto /;
my @list = qw/ Fritz Otto Fritz Josef /;
my %treffer;
my $re = join "|", @vorname;
for my $entry (@list) {
    if ($entry =~ m/^($re)\Z/) {
        $treffer{$1}++;
    }
}
print Dumper \%treffer;
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
Gast Gast
 2008-02-25 09:54
#106321 #106321
renee+2008-02-19 14:42:42--
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
for my $name (@vorname) {
        my $anz = grep{ $_ eq $name } @liste;
         if ( $anz ){
             print "Der Vorname <<< $name >>> ist $anz Mal vorhanden\n";
         }
         else   {
             print "Der Vorname <<< $name >>> ist nicht vorhanden\n";
         }
  }


Hallo Renee,

vielen Dank für Deine schnelle Antwort (die Lösung konnte ich sofort umsetzen). Leider hat mich eine Erkältung für einige Tage aus dem Verkehr gezogen, sodass ich jetzt erst wieder aktiv werden konnte.

Auch die Lösungen von "pq" und "murphy" werde ich mir noch mal genauer ansehen und ggf. auch so umsetzen. Vielen Dank auch an Euch.

Gruß
Markus
<< >> 5 Einträge, 1 Seite



View all threads created 2008-02-19 15:34.