Font
[thread]11327[/thread]

Wörter im Array zählen

Readers: 2


<< >> 5 entries, 1 page
wiederlader
 2008-02-19 15:34
#106102 #106102
User since
2007-01-03
36 articles
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 articles
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 articles
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 articles
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
guest 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 entries, 1 page



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