/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Net::DNS, hashes, Data::Dumper og jeg fatt~
Fra : Henrik Bøgh


Dato : 29-03-03 11:49

Hejsa jeg har et lille perl-script som jeg har to variationer af:

11:42 henrik@~/perl> cat net-dns-a.pl
#!/usr/bin/perl -w

use strict;
use Net::DNS;

my $resolver = Net::DNS::Resolver->new();
my $answer = $resolver->query('henrik.boegh.net');

if ($answer) {
foreach my $rr (grep {$_->{'type'} eq "A"} $answer->answer) {
print $rr->{'address'} . "\n";
}
}
11:42 henrik@~/perl> perl net-dns-a.pl
80.199.163.94
11:42 henrik@~/perl>

Denne variation (A) giver det rigtige resultat.
Jeg har så (for forståelsens skyld) forsøgt forsøgt at lave en variation (B)
over samme tema:

11:41 henrik@~/perl> cat net-dns-b.pl
#!/usr/bin/perl -w

use strict;
use Net::DNS;

my $resolver = Net::DNS::Resolver->new();
my $answer = $resolver->query('henrik.boegh.net');

foreach ($answer->{'answer'}) {
if ($_->{'type'} eq "A") {
print $_->{'address'} . "\n";
}
}

11:41 henrik@~/perl> perl net-dns-b.pl
Argument "A" isn't numeric in hash element at net-dns-b.pl line 10.
Bad index while coercing array into hash at net-dns-b.pl line 10.
11:41 henrik@~/perl>

A virker - B gør ikke. Og jeg fatter ærlig talt ikke en brik af hvorfor A
virker når B ikke gør.

En Dumper($query) giver følgende:

$VAR1 = bless( {
'seen' => {
'boegh.net. 21600 IN NS
ns1.pil.dk.' => '1',
'boegh.net. 21600 IN NS
ns2.pil.dk.' => '1',
'henrik.boegh.net. 1800 IN A
80.199.163.94' => '1',
'ns3.pil.dk. 4711 IN A
62.79.90.67' => '1',
'ns1.pil.dk. 4711 IN A
193.162.142.2' => '1',
'boegh.net. 21600 IN NS
ns3.pil.dk.' => '1',
'ns2.pil.dk. 4711 IN A
212.130.225.154' => '1'
},
'answerfrom' => '10.0.0.1',
'additional' => [
bless( {
'address' => '193.162.142.2',
'ttl' => 4711,
'class' => 'IN',
'rdlength' => 4,
'rdata' => 'Á¢',
'type' => 'A',
'name' => 'ns1.pil.dk'
}, 'Net::DNS::RR::A' ),
bless( {
'address' => '212.130.225.154',
'ttl' => 4711,
'class' => 'IN',
'rdlength' => 4,
'rdata' => 'Ôá',
'type' => 'A',
'name' => 'ns2.pil.dk'
}, 'Net::DNS::RR::A' ),
bless( {
'address' => '62.79.90.67',
'ttl' => 4711,
'class' => 'IN',
'rdlength' => 4,
'rdata' => '>OZC',
'type' => 'A',
'name' => 'ns3.pil.dk'
}, 'Net::DNS::RR::A' )
],
'header' => bless( {
'qdcount' => 1,
'rcode' => 'NOERROR',
'cd' => 0,
'tc' => 0,
'opcode' => 'QUERY',
'arcount' => 3,
'nscount' => 3,
'aa' => 1,
'qr' => 1,
'ra' => 1,
'ancount' => 1,
'id' => 15992,
'ad' => 0,
'rd' => 1
}, 'Net::DNS::Header' ),
'compnames' => {},
'question' => [
bless( {
'qclass' => 'IN',
'qtype' => 'A',
'qname' => 'henrik.boegh.net'
}, 'Net::DNS::Question' )
],
'answersize' => 158,
'authority' => [
bless( {
'nsdname' => 'ns1.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 12,
'rdata' => 'ns1pildk',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' ),
bless( {
'nsdname' => 'ns2.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 6,
'rdata' => 'ns2ÀB',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' ),
bless( {
'nsdname' => 'ns3.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 6,
'rdata' => 'ns3ÀB',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' )
],
'answer' => [
bless( {
'address' => '80.199.163.94',
'ttl' => 1800,
'class' => 'IN',
'rdlength' => 4,
'rdata' => 'PÇ£^',
'type' => 'A',
'name' => 'henrik.boegh.net'
}, 'Net::DNS::RR::A' )
]
}, 'Net::DNS::Packet' );

Jeg bruger
perl v5.6.1 på en Linux-dunk (precompiled Debian binaries)
Data::Dumper v2.102
Net::DNS v0.33

Nogen der har et clue om hvorfor variation A virker og B ikke gør?!??

--
Med Venlig Hilsen: Henrik Bøgh || http://henrik.boegh.net/geek/usenet.html

"Lies, deceit, mixed messages... this is turning into a real marriage"
-- John Travolta as Castor Troy in 'Face/Off'


 
 
Lars Balker Rasmusse~ (29-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 29-03-03 12:06

Henrik Bøgh <henrik@lagengymnastik.dk> writes:
> Hejsa jeg har et lille perl-script som jeg har to variationer af:
>
> 11:42 henrik@~/perl> cat net-dns-a.pl
> #!/usr/bin/perl -w
>
> use strict;
> use Net::DNS;
>
> my $resolver = Net::DNS::Resolver->new();
> my $answer = $resolver->query('henrik.boegh.net');
>
> if ($answer) {
> foreach my $rr (grep {$_->{'type'} eq "A"} $answer->answer) {
> print $rr->{'address'} . "\n";
> }
> }
> 11:42 henrik@~/perl> perl net-dns-a.pl
> 80.199.163.94
> 11:42 henrik@~/perl>
>
> Denne variation (A) giver det rigtige resultat.
> Jeg har så (for forståelsens skyld) forsøgt forsøgt at lave en variation (B)
> over samme tema:
>
> 11:41 henrik@~/perl> cat net-dns-b.pl
> #!/usr/bin/perl -w
>
> use strict;
> use Net::DNS;
>
> my $resolver = Net::DNS::Resolver->new();
> my $answer = $resolver->query('henrik.boegh.net');
>
> foreach ($answer->{'answer'}) {
> if ($_->{'type'} eq "A") {
> print $_->{'address'} . "\n";
> }
> }

Du bruger $answer->answer i det fungerende eksempel, og
$answer->{answer} i det ikke fungerende eksempel.

Den anden er en del af Net::DNS implementationen, som tilfældigvis er
en reference til det array du får fra den første.
--
Lars Balker Rasmussen                  "S.M.R.T."

Henrik Bøgh (29-03-2003)
Kommentar
Fra : Henrik Bøgh


Dato : 29-03-03 12:55

Lars Balker Rasmussen wrote in dk.edb.programmering.perl:

[...]

> Du bruger $answer->answer i det fungerende eksempel, og
> $answer->{answer} i det ikke fungerende eksempel.
>
> Den anden er en del af Net::DNS implementationen, som tilfældigvis er
> en reference til det array du får fra den første.

Aaaah ja - den havde jeg ikke lige gennemskuet :)
Men det bringer mig så til et andet (mere generelt hash-) spørgsmål:

Jeg har sakset følgende del fra Dumper($answer) :

$VAR1 = bless( {
[...]
'authority' => [
bless( {
'nsdname' => 'ns1.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 12,
'rdata' => 'ns1pildk',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' ),
bless( {
'nsdname' => 'ns2.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 6,
'rdata' => 'ns2ÀB',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' ),
bless( {
'nsdname' => 'ns3.pil.dk',
'ttl' => 21600,
'class' => 'IN',
'rdlength' => 6,
'rdata' => 'ns3ÀB',
'type' => 'NS',
'name' => 'boegh.net'
}, 'Net::DNS::RR::NS' )
],
[...]
}, 'Net::DNS::Packet' );

Hvis jeg nu vil udtrække de tre 'nsdname' værdier ville jeg umiddelbart gøre
noget alà

foreach ($answer->{'authority'}) {
if ($_->{'nsdname'}) {
print $_->{'nsdname'} . "\n";
}
}

men får igen:

Argument "ns1.pil.dk" isn't numeric in hash element at x.pl line 10.
Bad index while coercing array into hash at x.pl line 10.

Til trods for stor søgning på groups.google.com og læsen i Programming Perl
om hashes må der være et eller andet jeg simpelthen ikke fatter...

> Lars Balker Rasmussen "S.M.R.T."

--
Med Venlig Hilsen: Henrik Bøgh || http://henrik.boegh.net/geek/usenet.html

"Sad in a Star Trek Convention kindda-way"
-- Michael Boatman as Carter Heywood in 'Spin City'


Lars Balker Rasmusse~ (29-03-2003)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 29-03-03 13:04

Henrik Bøgh <henrik@lagengymnastik.dk> writes:
> 'authority' => [
> bless( {
> 'nsdname' => 'ns1.pil.dk',
>
> Hvis jeg nu vil udtrække de tre 'nsdname' værdier ville jeg umiddelbart gøre
> noget alà
>
> foreach ($answer->{'authority'}) {
> if ($_->{'nsdname'}) {
> print $_->{'nsdname'} . "\n";
> }
> }

Du skal være opmærksom på at $answer->{authority} er en reference til
et array ([ ] laver en anonym arrayref), og det array indeholder
referencer til hashes ({ } anonym hashref). Følgende burde virke:

foreach (@{$answer->{'authority'}}) {
if ($_->{'nsdname'}) {
print $_->{'nsdname'} . "\n";
}
}
--
Lars Balker Rasmussen                  "S.M.R.T."

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste