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

Hash aus Datei an Skalar binden

Leser: 1


<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-11-22 11:33
#102758 #102758
Hallo,


ich hab folgendes Problem:

in einer Textdatei (z.B. hash.txt) liegt ein Hash vor, z.B:

{
Klaus => 'daheim',
Peter => 'unterwegs'
}

Nun möchte ich diesen Hash aus der Datei an ein Objekt in Perl binden.
Folgender Syntax liefert mir hierbei aber nicht das gewünschte Ergebnis:

Code: (dl )
1
2
3
4
5
6
7
open(FH, "hash.txt");
my @hash = <FH>;
close FH;

my $object;
my $list = '$object =' . "@hash";
eval ($list);


Leider erscheint hier mit der Ausgabe via Data::Dumper nur ein "undef"...


Wer kann mir helfen?

Dankö <(*.*)>
renee
 2007-11-22 12:00
#102762 #102762
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dafür gibt's mehrere Möglichkeiten.

*) do (würde ich vorziehen)...

Code (perl): (dl )
1
2
3
4
5
6
7
8
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my $hashref = do "hashref.txt";
print Dumper $hashref;


*) eval (eval ist böse)...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @lines = <DATA>;
my $hashref = eval join '', @lines;
print Dumper $hashref;

__DATA__
{
Klaus => 'daheim',
Peter => 'unterwegs'
}
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/
bloonix
 2007-11-22 12:08
#102766 #102766
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use strict;
use warnings;
use Safe;
use Data::Dumper;

open my $fh, '<', 'hashref.txt' or die $!;
my $input = do { local $/; <$fh> };
close $fh;

my $sandbox = Safe->new;
my $hashref = $sandbox->reval($input);
die $@ if $@;

print Dumper($hashref);
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
ptk
 2007-11-22 22:22
#102842 #102842
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
renee+2007-11-22 11:00:31--
*) eval (eval ist böse)...

String-eval ist nur böse, weil zur Laufzeit compiliert wird. Das tut man bei do aber auch.
RPerl
 2007-11-22 22:33
#102845 #102845
User since
2006-11-26
384 Artikel
BenutzerIn

user image
Hallo renee, ptk

Es ist immer dann boese, wenn der Inhallt von eval() aus einer unsicheren Quelle kommt und nicht verifiziert wird. (e.g. user input)

schoenen Abend euch beiden


rperl
Froschpopo
 2007-11-22 22:33
#102846 #102846
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
probier mal sowas hier

Code: (dl )
1
2
3
4
while (<DATEI>) {
my ($key, $value) = split(/\s*=>\s*/, $_, 2);
$vars{$key} = $value;
}
ptk
 2007-11-22 23:04
#102849 #102849
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
RPerl+2007-11-22 21:33:14--
Es ist immer dann boese, wenn der Inhallt von eval() aus einer unsicheren Quelle kommt und nicht verifiziert wird. (e.g. user input)

Das kann mit do() auch passieren, wenn man den Ursprung der Datei nicht kennt.

Die Lösung dazu kam ja schon von bloonix:
Statt do: Safe->rdo
Statt eval: Safe->reval
bloonix
 2007-11-23 09:05
#102863 #102863
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Bei do() finde ich die Fehlerabfrage auch ein wenig blöd,
da do() ja eigentlich alles macht... Öffnen und Evaluieren.
Ich zitiere mal aus Perldoc:

Code: (dl )
1
2
3
4
5
	unless ($return = do $file) {
warn "couldn't parse $file: $@" if $@;
warn "couldn't do $file: $!" unless defined $return;
warn "couldn't run $file" unless $return;
}
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
bloonix
 2007-11-23 09:22
#102864 #102864
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Gast+2007-11-22 10:33:36--
{
Klaus => 'daheim',
Peter => 'unterwegs'
}

Aber mal ne andere Frage... wofür brauchst du das
Vielleicht könnte man deinen Fall mit einem Serializer
ebenfalls lösen.
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.
<< >> 9 Einträge, 1 Seite



View all threads created 2007-11-22 11:33.