• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[Gelöst] Perl: Fehler beim Aufruf der log() - Funktion

M4j3stic

Newbie
Hallo Linux - Club - Gemeinde

Hab folgendes kleines Programm geschrieben:

Code:
#!/usr/bin/perl

use Net::IP;

my $ip = new Net::IP('192.168.0/24') or die(Net::IP::Error());

#Usage() if (@ARGV != 0 and $ARGV[0] eq "-h");

sub get_hosts{

   return new Net::IP($_[0]->last_ip())->intip() - $_[0]->intip();
   }

print get_hosts($ip)."\n";

# Berechnung des ld()
print log(get_hosts($ip))/log(2);

# Lange schreibweise, vllt stimmt ja an der Funktion was nicht
print log((new Net::IP($ip->last_ip())->intip()) - ($ip->intip()));

Beim Ausführen gibt er mir immer diesen Fehler aus:

Code:
Can't use an undefined value as an ARRAY reference at /usr/share/perl/5.8/Math/BigInt/Calc.pm line 1376.

Warum? Was mach ich falsch? Wie kann ich den Fehler beheben?

Danke

Stephan
 
OP
M

M4j3stic

Newbie
jengelh schrieb:
Was soll dein Programm eigentlich machen?
Es soll aus einem Adressraum die erste und letzte IP ermitteln.
Diese beiden Adressen in das Integer-Format umwandeln und anschließend die erste Adresse von der zweiten abziehen, um die theoretische Anzahl der mögllichen Hosts zu ermittteln.
Von dieser Anzahl soll mir dann der logarithmus dualis errechnet werden.

BTW, deine IP-Adresse ist falsch.
BTW, ist sie nicht ;)

Es handel sich um einen Adressraum und nicht um eine IP-Adresse, dieser kann in der Form vom Konstruktor so entgegen genommen werden.
Ich könnte auch

Code:
my $ip = new Net::IP('192.168.0.0-192.168.0.255')

eingeben und hätte das selbe Ergebnis.
 
OP
M

M4j3stic

Newbie
jengelh schrieb:
Probier doch mal den Beispielcode aus http://search.cpan.org/~manu/Net-IP-1.25/IP.pm aus.

ähm...

ist das nicht derselbe Code den ich auch benutzt habe?
Unabhängig davon beschäftige ich mich schon seit 2 Wochen mit diesem Modul. Soll heißen, war da auch schon paar mal. :)
schade nur, dass ich ne Funktion übersehen...
Code:
last_int()

aber das Problem liegt ja nicht bei dem IP-Berechnungen sondern, bei der Berechnung des Logarithmus, erst da gibt er ja die Fehlermeldung aus.

Der zurückgegeben Wert von der get_hosts() muss ja auch ein Zahlenwert sein, sonst hätte Perl ja schon vorher abgebrochen, weil er das nicht berechnen kann...
 
Der Debugger macht schlauer:
Code:
20:29 ichi:/dev/shm > perl -d x.pl 

Loading DB routines from perl5db.pl version 1.28
Editor support available.

Enter h or `h h' for help, or `man perldebug' for more help.

main::(x.pl:6): my $ip = new Net::IP('192.168.0/24') or die(Net::IP::Error());
  DB<1> n
main::(x.pl:15):        print get_hosts($ip)."\n";
  DB<1> 
255
main::(x.pl:18):        print log(get_hosts($ip))/log(2);
  DB<1> x $p = &get_hosts($ip)
0  Math::BigInt=HASH(0x86598e4)
   'sign' => '+'
   'value' => ARRAY(0x8659920)
      0  255
  DB<2> x log($p)
Can't use an undefined value as an ARRAY reference at /usr/lib/perl5/5.8.8/Math/BigInt/Calc.pm line 1338.
Und das leuchtet ja ein.
 
OP
M

M4j3stic

Newbie
Ich bin mit debuggen nicht ganz so vertraut, konnte das Ergebnis aber auch mit meinem Skript reproduzieren.

Bedeutet diese Stelle
Code:
  DB<1> x $p = &get_hosts($ip)
0  Math::BigInt=HASH(0x86598e4)
   'sign' => '+'
   'value' => ARRAY(0x8659920)
      0  255
  DB<2> x log($p)

,dass der zurück gelieferte Wert noch ein Array ist? Versteh ich das richtig?

Wenn das denn der Fall sein sollte, wie ändere ich das?

BTW,
Der Debugger macht schlauer:

Danke, auf die Idee wäre ich nie gekommen. "Klar es gibt ja sowas wie Debugger!" :)

Ein Sachse schrieb:
Manchmahl is man ooch wie vernoagelt
;)
 
OP
M

M4j3stic

Newbie
Tatsache, der Rückgabewert war ein Array, hab ihn in ein Skalar umgewandelt und schon hat es funktoniert!

Danke für deine Hilfe!

Grüße

Stephan
 
M4j3stic schrieb:
Bedeutet diese Stelle
Code:
  DB<1> x $p = &get_hosts($ip)
0  Math::BigInt=HASH(0x86598e4)
   'sign' => '+'
   'value' => ARRAY(0x8659920)
      0  255
  DB<2> x log($p)
,dass der zurück gelieferte Wert noch ein Array ist? Versteh ich das richtig?
Nein, das sagt uns, dass $p ein Objekt der Klasse Math::BigInt ist. Alles was darunter steht ist eigentlich implementationsbezogen und ist eigentlich "private" (wenn man C++-Terminologie verwendet). Du musst also die entsprechende Funktion aus BigInt suchen, die dir den Wert zurückgibt. Falls es die nicht gibt, darfst du auch mit $p->{value}[0] tricksen, aber das beißt dich, wenn du mit IPv6-Adressen arbeitest, weil die länger sind als ein 32-Bit-Integer (dann hat "value" nämlich mehrere Elemente, um überhaupt den IPv6-128-Bit-Integer zu repräsentieren).
 
OP
M

M4j3stic

Newbie
Stimmt, aber da ja Objekte, nüchtern gesehen, auch nichts anderes als Arrays sind...

Naja, Hauptsache es läuft und ich weiß woran es gehapert hat.

Danke noch mal für deine Hilfe.

Stephan
 
Oben