1
votes

I would like to match multi-word string items (stored in an array) as regexes in a text file, multiple times. I'd also like to create a hash with the matched items as keys and the number of occurrences as their values (ideally sorted by the values). Here is what I have so far:

Read in text file where items are to be matched:

open(FILE, "<file.txt") or die "cannot open file for reading: $!";
local $/ = undef;
my $inputfile = <FILE>;
close FILE;

Loop through multi-word array, convert each item into a regex, then match regex in $inputfile and create hash of occurrences:

foreach my $mwe (@mwelist) {
    my $mweregex = quotemeta($mwe);
    foreach ($inputfile =~ /($mweregex)/g) {
        #print STDOUT "$1\n\n";
        $mweinputfile{$mwe}++;
    }
}

@mwelist is an array containing string items, each of two words or more.

Right now the code is not working - if I uncomment the print command, it just gives me empty lines (just empty lines, no spaces) in the shell.

Thankful for any pointers/corrections/suggestions,

Here is an example line of input data (file.txt in the above):

Sehr geehrter Herr Geißler, meine sehr geehrten Damen und Herren nicht nur hier im Saal sondern auch an den Bildschirmen! Wir möchte gern die Diskussion über die Schnellfahrstrecke Wendlingen-Ulm – und Herr Geißler, um auch da für Klarheit zu sorgen: Wenn wir von Neubaustrecke oder Schnellfahrstrecke reden, meinen wir dasselbe – diese Diskussion möchte ich mit einem Überblick beginnen, der Sie darüber informiert, warum wir diese Schnellfahrstrecke vorsehen, was der verkehrliche Vorteil und der verkehrliche Nutzen ist, und darüber hinaus natürlich soll ein Überblick gegeben werden, warum sie genau so geplant und ausgeführt wird, wie sie hier dargestellt ist.

And here are a few examples from @mwelist:

...

in gewissem Sinne

in gewissen Fällen

gewiß nicht

das weiß ich ganz gewiß

...

1
Can you give us an example of the input data?fugu
What is your question? Is your code not working?TLP
It's going to be hard to figure out where you're going wrong if you don't provide the contents of @mwelistZaid

1 Answers

1
votes

OK - so I've changed things to hopefully better deal with the problem.

I tried the words you want to match in the original file, and found no occurrences, so I randomly interspersed them through the file to give some output:

#!/usr/bin/perl
use warnings;
use strict;
use Data::Dumper;

my $file1 =("in gewissem Sinne Herr Geißler, in gewissen Fällen geehrten Damen in gewissen Fällen nicht nur hier im Saal sondern auch an den Bildschirmen! Wir möchte gern die Diskussion über die Schnellfahrstrecke Wendlingen-Ulm – und Herr Geißler, um auch da für Klarheit zu sorgen: Wenn wir in gewissen Fällen oder Schnellfahrstrecke reden, meinen wir dasselbe – diese Diskussion gewiß nicht einem Überblick beginnen, in gewissen Fällen informiert, warum wir diese in gewissen Fällen vorsehen, was der verkehrliche Vorteil und der verkehrliche Nutzen ist, und darüber hinaus natürlich soll ein Überblick gegeben werden, warum sie genau so geplant und ausgeführt wird, wie sie hier gewiß nicht");

# my @input1 = split('\s+', $file1);
# print Dumper \@input1;
my @input2 =('in gewissem Sinne', 'in gewissen Fällen', 'gewiß nicht', 'das weiß ich ganz gewiß');
# my @input2 = split('\s+', $file2);

my %hash;
foreach my $line (@input2){
    while ($file1 =~ m/$line/g){
    $hash{$line}++;
    }       
}

print Dumper \%hash;

Outputs:

$VAR1 = {
          'gewiß nicht' => 2,
          'in gewissem Sinne' => 1,
          'in gewissen Fällen' => 5
        };