|
| 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."
| |
|
|