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

XML Parsing Problem

Leser: 1


<< >> 4 Einträge, 1 Seite
Gast Gast
 2006-06-08 07:00
#67102 #67102
So muss mich mal an die Altmeister hier wenden :)

Ich habe mir ein kleines perl script gecodet welches Hashes anhand einer regexp erkenne soll. Dazu wird ein xml file geparsed( und anschließend der/die Type/n ausgegeben. Hier erstmal der Code:

Code: (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
28
29
30
31
32
#!/usr/bin/perl
# Hash Analyzer 0.1 (c) 2006 by eSpy

# use module
use strict;
use warnings;
use XML::Simple;

# variables
my $file = 'hashdb.xml';
my $hash = '4TKMer2ittZ7c';

# create object
my $xml = XML::Simple->new();

# read xml file
my $hashdb = $xml->XMLin($file);

# parsing hash
foreach my $entry (@{$hashdb->{hash}})
{
if ($hash =~ /$entry->{regexp}/)
{
print "\nPossible Hash types:\n\n";

foreach my $type (@{$entry->{type}})
{
print $type."\n";
}
last;
}
}


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="iso-8859-1"?>
<hashdb>
<hash regexp="^[0-9a-fA-F]{4}$">
<type>CRC-16-CCITT</type>
<type>CRC-16</type>
<type>FCS-16</type>
</hash>

<hash regexp="^[0-9a-zA-Z]{13}$">
<type>DES (Unix)</type>
</hash>
</hashdb>


Das funktioniert alles auch soweit, allerdings nur wenn ich mehrere Typen habe, die zu einem Hash passen. Sobald ich
allerdings versuche z.B. den DES Typ zu erkennen, wo nur ein Type angegeben ist, bekomme ich folgende Fehlermeldung:

Quote
Can't use string ("DES (Unix)") as an ARRAY ref while "strict refs" in use at hash.pl line 25.


Ich vermute es liegt daran, das er einem Array nicht nur einen Wert zuweisen kann. Ich könnte den Fehler umgehen indem ich bei DES einfach einen weiteren Type hinzufüge mit irgendeinem nonsense aber es liegt nicht in meiner Natur Problemen aus dem Weg zu gehen :) Kann mir hier jmd. helfen den Bug auszumerzen?

Nur noch mal zur Info Hashes sind z.B. fingerprints von Dateien um herauszufinden ob sie korrekt übertragen wurden, oder aber auch verschlüsselte Passwörter.

Thanks for you answers in advance!
eSpy
ptk
 2006-06-08 10:19
#67103 #67103
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Man kann XML::Simple per Option dazu zwingen, *immer* Arrays anzulegen. Oder man verwendet gleich XML::LibXML und erzeugt die Perl-Datenstrukturen händisch.
renee
 2006-06-08 12:08
#67104 #67104
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das bei bei CPAN:XML::Simple heißt ForceArray...
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/
Dubu
 2006-06-11 03:06
#67105 #67105
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Zur Not fragt man ab, ob es ein Array ist:
Code: (dl )
foreach my $type (ref($entry->{type}) eq 'ARRAY' ? @{$entry->{type}} : $entry->{type})

"ForceArray" ist da wohl übersichtlicher.
<< >> 4 Einträge, 1 Seite



View all threads created 2006-06-08 07:00.