#!/usr/bin/perl use strict; use warnings; use Getopt::Long; # Parameteruebergabe my $infile1; my $outfile='C:\Complete_List.datafield'; # Uebergabeparameter einlesen GetOptions ('i=s' , \$infile1); print "$infile1\n"; my %Datafield_List; # wenn die Datei existiert, # den Inhalt einlesen if(-f $outfile) { open( my $out_fh, '<', $outfile ) || die "\n Die Datei $outfile konnte nicht gelesen werden ($!)\n"; my @DataList = <$out_fh>; close($out_fh); chomp(@DataList); # den Inhalt von $outfile Lesen # und die Einträge in einen Hash wandeln. # Das besondere an einem Hash ist, # das ein Schüssel nur einmal vorkommen darf # schreibt man allso alle einträge als Schlüssel in einen hash # bleibt eine Liste übrig, in der Jeder Wert nur einmal vorkommt. for $my eintrag (@DataList) { $Datafield_List{$eintrag}++; } } # die XML Datei einlesen open ( my $FILE1, '<', $infile1) || die "\n Die Datei $infile1 konnte nicht geoeffnet werden ($!)\n"; my $line_nr=0; while(my $zeile=<$FILE1>) { chomp($zeile); $line_nr++; # finde in der Zeile was nach aussieht if($zeile =~ m/<(\w+)\s+(.*?)\s*>/i) ## ich suche nach < gefolgt (direkt?) nach irgendeiner Zeichenfolge, ## die ein Steuerzeichen und Steuerzeichen bestehen, ## gefolt von belieben Zeichen? ## Kann ich da eine kleine Erklärung haben? # # \w repräsentiert "Wort-Zeichen". Das sind "A" bis "Z", "a" bis "z", "0" bis "9" und "_" # \w+ ist also eine Zeichenkette, aus "Wort-Zeichen" # die Runde klammer besagt, das der gefundene String zurück geben werden soll # \s+ besagt mindestens ein Leezeichen, oder biebig viele # (.*?) heißt finde irgendwelche Zeichen, gib dich mit der kleinsten Stringlänge zufrieden die passt. # \s* kein oder beliebig viele Leezeichen # wie ich schon schreib findet diese RegExp XML-Tags. # Ein XML-Tag beginnt mit einem "<" Dann folgt eine Zeichenkette die nur aus A-Za-z0-9_ bestehen darf, # dann kommen optionale Optionen der Form " key="value" " abgeschlossen wird der Tag mit ">" { # gefundener Name des XML-Tags my $name=$1; #aus der 1. Klammer?? # in $name steht das was "(\w+)" gefunden hat # parameter in dem XML-Tag my $params=$2; #aus der 2. Klammer?? bräuchte hierzu eine kleine Erklärung von der oberen Suche # in $parameter steht was mit "(.*?)" gefunden wurde # weiter wenn nicht der gesuchte Tag next unless($name eq 'Measurement' or $name eq 'Parameter'); # finde in $params alles was nach key="wert" aussieht: while($params =~ /(\w+)\s*=\s*"([^"]+)"\s*/gc) #kannst du mir dazu etwas erklären { my $key=$1; my $val=$2; # weiter wenn $key nicht "nameAsap2" oder "name" next unless( $key eq 'nameAsap2' or $key eq 'name' ); # wenn Länge des Inhalts größer als 32 Zeichen if(length($val) > 32) { my $File = $infile1; print "\n !!! FEHLER !!! \n"; print "In der Datei '$File' Zeile $line_nr besitzt folgender Strukturmember eine groessere Zeichenkette als 32 Zeichen: '$val'\n" print "Der Bezeichnername ist in der folgenden Zeile als $key bezeichnet: '$zeile'\n"; } # nun wird geprüft ob der Wert in $val noch unbekannt ist if($Datafield_List{$val}) { print "\n !!! FEHLER !!! \n"; print "In der Datei '$File' Zeile $line_nr besitzt folgender Strukturmember eine schon verwendetete Zeichenkette: '$val'\n" print "Der Bezeichnername ist in der folgenden Zeile als $key bezeichnet: '$zeile'\n"; } # den Wert in $val zur Liste der Werte hinzufügen $Datafield_List{$val}++; } } } close($FILE1); # jetzt noch die erweiterte Liste in %Datafield_List speichern # damit sie beim nächsten Durchlauf bekannt ist. { open( my $out_fh, '>', $outfile ) || die "\n Die Datei $outfile konnte nicht geöffnet werden ($!)\n"; print "$_\n" for(keys(%Datafield_List)); close($out_fh); }