Meine Regex stimmt nur mit einigen der Ausdrücke überein. Wenn ich den Ausdruck auf regex101.com teste, funktioniert es gut ... was könnte das Problem mit meinem Code sein?Perl: Regex nur einige Male passend
Vielen Dank für Ihre Hilfe im Voraus.
Beispieldatei "surfacecoating":
[
('amino acids', 339, 350),
('copper', 71, 77),
('copper', 0, 6),
('copper', 291, 297),
('amino acids', 119, 130)]
Was Dumper ausdruckt für diese Datei (beachten Sie die ersten 3 Spiele werden nicht zurückgegeben):
'surfacecoating' => {
'copper' => '291',
'amino acids' => '119'
},
der Code:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
determine_cde_instances();
sub determine_cde_instances {
my %cdeinstances;
my %cde_instances;
my $dir = "/results/CDE";
opendir my $dh, $dir or die "Can't open $dir: $!";
while (my $file = readdir($dh)) {
next if ($file =~ m/^\./);
next if -d $file;
open my $fh, '<', "$dir/$file" or die "Can't open $dir/$file: $!";
while (my $line = <$fh>)
{
if (my ($instance) = $line =~ m/'(.*?)', (.*?), /)
{
my $instance = $1;
my $pos = $2;
$cde_instances{$file}{$instance} = $pos;
}
}
close $fh;
}
close $dh;
print Dumper(\%cde_instances);
return %cde_instances;
}
Ihre Datendatei ist eine Sammlung von Sequenzen, aber Ihr Code erstellt ein (verschachteltes) assoziatives Array, das auf einem Mitglied der Sequenzen codiert ist. Ein [Array von Arrays] (http://perldoc.perl.org/perldsc.html#ARRAYS-OF-ARRAYS) stellt offensichtlich die Struktur in Ihrer Datendatei dar - aber welche Struktur möchten Sie im Code haben? Mit anderen Worten, was hätten Sie von 'Dumper' erwartet? – pilcrow
Sie überschreiben wahrscheinlich alle 'cde_instance', während Sie sie zu' $ cde_instances' hinzufügen (es kann die erste Übereinstimmung als Schlüssel annehmen [nur eine Schätzung], was für '('copper', 0, 6) 'gleich ist und '('copper', 291, 297)'. Benutze einen anderen Schlüssel (anders als '$ instance') in:' $ cde_instances {$ file} {$ instance} = $ pos; ' –