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

Fehler beim Aufruf der log() Funktion



<< >> 9 Einträge, 1 Seite
Gast Gast
 2007-07-13 10:58
#78434 #78434
Hallo Gemeinde

Hab folgendes kleines Programm geschrieben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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: (dl )
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
bieber
 2007-07-13 11:52
#78435 #78435
User since
2007-06-18
148 Artikel
BenutzerIn
[default_avatar]
1. benutze bitte

Code: (dl )
1
2
use strict;
use warnings;


damit kommst du bestimmt schon weiter

2. wäre vielleicht gut zu wissen welche Zeile denn Zeile 1376 ist
3. deine Programmierart find ich persöhnlich grausam, du lässt Berechnungen und Funktionsaufrufe im print-Befehl machen....
4. man arbeitet nie direkt mit @_ in Funktionen, könnte auch der Fehler sein,

Code: (dl )
(my $ip)=@_; 


wobei ich zugeben muss, dass ich deine sub get_hosts net wirklich kapiere^^
Es gibt immer Leute die meinen, sie seien schlauer als ich. Das Schlimmste ist, sie sind es auch.
majestic
 2007-07-13 12:24
#78436 #78436
User since
2007-07-13
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
So, nun doch angemeldet :)

Quote
1. benutze bitte

Code: (dl )
1
2
use strict;
use warnings;


damit kommst du bestimmt schon weiter


Nein, bringt mich leider nicht weiter.

Quote
2. wäre vielleicht gut zu wissen welche Zeile denn Zeile 1376 ist


Stimmt!
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
   1367 sub _log_int
1368 {
1369 # calculate integer log of $x to base $base
1370 # ref to array, ref to array - return ref to array
1371 my ($c,$x,$base) = @_;
1372
1373 # X == 0 => NaN
1374 return if (scalar @$x == 1 && $x->[0] == 0);
1375 # BASE 0 or 1 => NaN
1376 return if (scalar @$base == 1 && $base->[0] < 2);
1377 my $cmp = _acmp($c,$x,$base); # X == BASE => 1
1378 if ($cmp == 0)
1379 {
1380 splice (@$x,1); $x->[0] = 1;
1381 return ($x,1)
1382 }
1383 # X < BASE
1384 if ($cmp < 0)
1385 {
1386 splice (@$x,1); $x->[0] = 0;
1387 return ($x,undef);
1388 }
1389




Quote
3. deine Programmierart find ich persöhnlich grausam, du lässt Berechnungen und Funktionsaufrufe im print-Befehl machen....
4. man arbeitet nie direkt mit @_ in Funktionen, könnte auch der Fehler sein,

Code: (dl )
(my $ip)=@_; 


Das ist nur ein Beispiel. Normalweise würd ich sowas nicht machen, ich wollt nur die Problematik verdeutlichen, damit das Problem auch woanders reproduzierbar ist

Quote
wobei ich zugeben muss, dass ich deine sub get_hosts net wirklich kapiere^^


In der get_hosts() werden 2 IP- Addressen in integer Zahlen umgewandelt und dann von einander abgezogen, der so enstandene Wert wird zurückgeliefert.
pq
 2007-07-13 12:46
#78437 #78437
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
$base ist undef, das erklärt die fehlermeldung. denn "Can't use an undefined value
as an ARRAY reference" heisst: "Kann keinen undefinierten Wert als Arrayreferenz benutzen".
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
majestic
 2007-07-13 12:55
#78438 #78438
User since
2007-07-13
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
"Can't use an undefined value
as an ARRAY reference" heisst: "Kann keinen undefinierten Wert als Arrayreferenz benutzen".


Danke für die Englischnachhilfe ;)

Quote
$base ist undef, das erklärt die fehlermeldung.

Die Frage ist nur Warum?

Wenn ich eine Ziffer in eine Variable gebe und dann der log() Funktion übegebe funktioniert es auch.

Code: (dl )
1
2
3
4
5
6
my $zahl;
chomp($zahl =<STDIN>);
my $ausgabe = log($zahl);

# Für bieber;)
print $ausgabe;



Warum nicht mit den Integerwert aus der get_host() ?
renee
 2007-07-13 13:27
#78439 #78439
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was sagt denn
Code: (dl )
1
2
my $ip2 = Net::IP->($ip->last_ip)->intip);
print $ip2;
?

Und
Code: (dl )
print $ip->intip;
?
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/
majestic
 2007-07-13 13:45
#78440 #78440
User since
2007-07-13
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Code: (dl )
1
2
3
4
5
my $ip = new Net::IP('192.168.0/24');
my $ip2 = new Net::IP($ip->last_ip())->intip();
print $ip2."\n";
print $ip->intip()."\n";
print $ip2 - $ip->intip()."\n";


ergibt:
Code: (dl )
1
2
3
3232235775
3232235520
255


scheint also alles zu stimmen...
topeg
 2007-07-13 23:49
#78441 #78441
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das ist aber alles Math::BigInt Objekte. um damit normal weiterarbeiten zu können mußt du sie erst umwandeln:
Code (perl): (dl )
1
2
3
sub get_hosts{
    return (new Net::IP($_[0]->last_ip())->intip() - $_[0]->intip())->numify;
  }

Oder du arbeitest weiter mit den BigInt Objekten.
majestic
 2007-07-14 00:38
#78442 #78442
User since
2007-07-13
4 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke, bin mit Hilfe des Debuggers auch darauf gekommen. Da muss man erstmal dran denken, dass es sowas gibt! ;)
Quote
Das ist aber alles Math::BigInt Objekte.

Das war der ganze hacken an der Sache.

Nochmals Danke & einen schönen Abend noch!

Stephan
<< >> 9 Einträge, 1 Seite



View all threads created 2007-07-13 10:58.