Schrift
[thread]8612[/thread]

Soll man den hash "resetten" ?: Suche die Lösung für %Hash



<< >> 8 Einträge, 1 Seite
polkana
 2006-12-30 13:27
#72807 #72807
User since
2004-06-18
74 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo,

seit eine Woche habe bis her keine Lösung gefunden und hoffe jemand weist schon die Antwort auf meine Frage hier.

in meinem Script wird ein Hash benutzt, der so aussiet:
Code: (dl )
1
2
3
4
5
6
7
8
our %providers = (
'Telecom1' => '80.80.105.0 - 80.80.111.255',
'Telecom2' => '83.136.112.0 - 83.136.112.255',
'IDEA (India)' => '203.145.137.160 - 203.145.137.191',
'Simobil (Slovenia)' => '80.95.224.0 - 80.95.228.255',
'Omar Monges (Lat. Amerika)' => '200.0.0.0 - 200.255.255.255',
'DataElectronics (Ireland)' => '217.114.160.0 - 217.114.175.255',
);

und so weiter...

Ich durchsuche über diesen Hash die IP Adresse die ich extra in einem Datenbank habe und wenn diese IP passt zur Maske in diesem Hash, merke ich "+1", und so macht es immer weiter bis mehrere IPs zu Ende sind.
Die Code siet so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use strict;
use StFunc;
our %provider_cache = ();
my $ip = '217.118.85.66';
detect_ip($ip); #Ist in StFunc.pm defined
# %provider_cache wird befüllt mit angaben 'Provider' => '1'
# while weiter ist nur zum testzweck hier um zu sehen wird die IP erkannt oder nicht (0 oder 1 ergibt)
while(my($prv, $ip) = each(%provider_cache))
{
print "$prv => $ip\n";
}
exit;

Wenn ich den Script run mache, zeigt es dass die IP erkannt wurde.... Sollte ja gut gehen, doch es stimmt etwas nicht.

Ausschlislich benutze ich um zu schnellstarbeiten mod_perl.
Und auch CGI - es wird über HTTP Interface gleich die Ausgabe vergeben, wie viel Percent Provider sind gerade da.

Problem ist in dem, dass ich noch weder richtige Zahlen die "Unbekannte" Provider kriege, und trotz die IP die bereit im Hash verlegt sind lässt der Script sie nicht merken.


Ja... viel geschrieben und selbst stelle ich vor wie das schwehr die richtige weg zeigen. Und deshalb dachte ich dass irgend wie der %ProviderHash einfach resetten soll, da aber weis ich nicht wie. In PHP es ist einfach reset($array) - und wie geht es mit Perl?

PS
Sollte ich mehr Code zeigen? mache ich gerne.

Danke.
mfG Alexander
renee
 2006-12-30 14:06
#72808 #72808
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Was macht das reset bei PHP? Wenn Du das vielleicht erklärst lässt sich bestimmt einfacher sagen, was die Lösung für Dein Problem sein könnte.
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/
PerlProfi
 2006-12-30 14:09
#72809 #72809
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Ich glaube ich habe dein Problem nicht richtig verstanden, mit Perl den Hash zurücksetzen ist einfach: %hash = ();

Wenn es was mit detect_ip() zutun hat, dann poste doch auch mal den code von der subroutine.

MfG PerlProfi
polkana
 2006-12-30 15:07
#72810 #72810
User since
2004-06-18
74 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja ich dachte dass wenn ich aus den %providers  rausspringe mit last oder return, soll ich den hash zurücksetzen, da weiter fängt es nicht von Vorne sonder von den wo es rauspringte. Oder habe ich falshe Vermutung?\n\n

<!--EDIT|polkana|1167484091-->
renee
 2006-12-30 15:17
#72811 #72811
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So ein reset gibt es bei Perl nicht. In der Doku zu each (perldoc -f each) steht, dass man den Iterator nur zurücksetzen kann, indem man keys oder values aufruft oder sonst alle Elemente ausliest.

So könnte man es machen, wenn man mit last aus der Schleife geht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl

use strict;
use warnings;

my %hash = (test => 1, hallo => 2, dies => 3, ist => 4, ein => 5, welt => 6);

my $counter = 0;
while( my ($key,$val) = each %hash){
print $key, "//", $val,"\n";
# das "keys %hash" dient dem Reset!
keys %hash and last if ++$counter == 2;
}

print "dazwischen\n";

while( my ($key,$val) = each %hash){
print $key, "//", $val,"\n";
}
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/
polkana
 2006-12-30 17:30
#72812 #72812
User since
2004-06-18
74 Artikel
BenutzerIn
[Homepage] [default_avatar]
Dank Ihre Hilfe gebe ich die Source code. Villeicht hat jamand das schon geschrieben?
Na was solls..
Ich habe endlich nun nachgedacht dass man einfach kopieren in extra %hash kann.
Nun geht keine IP mehr unerkannt ;)

Die Code ermöglicht feststellen Providername, wenn man eine IP voliegt.
Kritick ist nicht abgeschlossen :) Einfach sagen wenn ihr meint.

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
our %providers = (
      'Telecom1' => '80.80.105.0 - 80.80.111.255',
      'Telecom2' => '83.136.112.0 - 83.136.112.255',
      'IDEA (India)' => '203.145.137.160 - 203.145.137.191',
      'Simobil (Slovenia)' => '80.95.224.0 - 80.95.228.255',
      'Omar Monges (Lat. Amerika)' => '200.0.0.0 - 200.255.255.255',
      'DataElectronics (Ireland)' => '217.114.160.0 - 217.114.175.255',
);
#Weiter muss man selbst es in Hash die Daten einlegen.

sub detect_ip {
       my $ip = $_[0] or return 0;
       my ($octA, $octB, $octC, $octD) = split(/\./, $ip);
       my ($provider);
       my (@explodes_ips);
       my $unknown_ip_base = $config{'base_path'}.'/unknownip.txt';
       my($f_a, $f_b, $f_c, $f_d);
       my $found=0;
       my %providers_hash = %providers;
       while (my($provider_name, $ip_backbone) = each(%providers_hash))
       {
           if ($ip_backbone =~ /;/)
           {
               @explodes_ips = split(/;/, $ip_backbone);
               foreach my $ips(@explodes_ips)
               {
                       my($ip_start, $ip_end) = split(/ - /, $ips);
                       my($ip_start_A, $ip_start_B, $ip_start_C, $ip_start_D) = split(/\./, $ip_start);
                       my($ip_end_A, $ip_end_B, $ip_end_C, $ip_end_D) = split(/\./, $ip_end);
                       $f_a=detect_octet($octA, $ip_start_A, $ip_end_A);
                       $f_b=detect_octet($octB, $ip_start_B, $ip_end_B);
                       $f_c=detect_octet($octC, $ip_start_C, $ip_end_C);
                       $f_d=detect_octet($octD, $ip_start_D, $ip_end_D);
                       if ($f_a and $f_b and $f_c and $f_d) {
                               $provider_cache{$provider_name} += 1;
return 1;
                       }
               }
           } else {
               my($ip_start, $ip_end) = split(/ - /, $ip_backbone);
               my($ip_start_A, $ip_start_B, $ip_start_C, $ip_start_D) = split(/\./, $ip_start);
               my($ip_end_A, $ip_end_B, $ip_end_C, $ip_end_D) = split(/\./, $ip_end);
               $f_a=detect_octet($octA, $ip_start_A, $ip_end_A);
               $f_b=detect_octet($octB, $ip_start_B, $ip_end_B);
               $f_c=detect_octet($octC, $ip_start_C, $ip_end_C);
               $f_d=detect_octet($octD, $ip_start_D, $ip_end_D);
               if ($f_a and $f_b and $f_c and $f_d) {
                       $provider_cache{$provider_name} += 1;
                       return 1;
               }
           }
       }
         $provider_cache{'Unbekannt'} += 1;
# Nur für DEBUG
         #if (! -f $unknown_ip_base)
         #{
           #    open(UNK, ">$unknown_ip_base") or die('Cannot open '.$unknown_ip_base.' : '.$!);
        # } else {
          #             open(UNK, ">>$unknown_ip_base") or die('Cannot open '.$unknown_ip_base.' : '.$!);
         #}
         #print UNK "$ip\n";
         #close(UNK);
         return 0;
}
sub detect_octet {
       my ($ip_octet, $octet_a, $octet_b) = @_;
       if ($ip_octet >= $octet_a and $ip_octet <= $octet_b)
       {
               return "1";
       }
       return 0;
}


Beispiel ist oben ;)

Noch mal danke und wünsche Sie ein frohes neues Jahr!
Alexander\n\n

<!--EDIT|polkana|1167495769-->
renee
 2006-12-30 17:54
#72813 #72813
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht wäre das Modul CPAN:Net::IP::Match::Regexp für Dich ganz interessant!
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/
polkana
 2006-12-30 18:18
#72814 #72814
User since
2004-06-18
74 Artikel
BenutzerIn
[Homepage] [default_avatar]
Danke renee,

ich habe mir den Ziehl gestellt, keine extra module verwenden, da der Script war zum Verkauf geschrieben, und es ist nicht so einfach die Module auch zu verwenden da es große belastung auf der Server geht. Und ein extra Modul auf meine Erfahrung hat das schon Scriptverarbeitungszeit gefresen, deshalb ich habe mir alles extra in ein StFunc.pm selbst gebastelt da ich mir mit leichtem Herz mein Geld verdient habe und Erfahrung aus Voraussetzungen erlernte habe.
Natürlich sind meistverwendete Modulen auch da eingebaut wie
Code: (dl )
1
2
3
4
use Encode;
use POSIX;
use Fcntl ':flock';
use GD;

Aber das war schon notig und ich ich konnte nicht ohne diese weiter arbeiten.
Aber selbstgeschriebene sind ja trotzdem weiter zu empfehlen, da man nicht "für alle Fälle" macht, sondern nur für ein Zweck, und das spart Zeit und Leistungen
;)
<< >> 8 Einträge, 1 Seite



View all threads created 2006-12-30 13:27.