• Publicidad

Paso de parámetros raro

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Paso de parámetros raro

Notapor digitallxd » 2007-07-30 05:32 @272

Dios, me vais a tener que perdonar por ser tan pesado, y de paso os agradezco todo lo que habéis hecho ya por mí.

Resulta que ahora tengo otra duda, que no puedo entender porque no va, el simple hecho de cambiar una variable con valor a pasarle como parámetro algo hace que la cosa deje de funcionar...

Tengo este script que hace, mediante SNMP, ping de un router a otro y me dice el tiempo medio y el número de paquetes en % correctos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /usr/bin/perl
use strict;
use Socket;
use Net::SNMP;


&latencia();
exit 0;

sub latencia {

        my $numofpackets = 5;
        my $packetsize = 64;
        my $ipaddress ='200.1.23.100';

        my $router = '200.9.21.100';
        my $community = 'password'; #



        my ($session, $error) = Net::SNMP->session(
          -hostname => shift || $router,
          -community => shift || $community,
          -port => shift || 161
        );

        if (!defined($session)) {
            printf("ERROR: %s.\n", $error);
            exit 1;
        }

        my $response = $session->set_request(('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6,
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 5,
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.15.333', OCTET_STRING, 'SLA',
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.2.333', INTEGER, 1,
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.3.333', OCTET_STRING, inet_aton($ipaddress),
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.4.333', INTEGER, $numofpackets,
                                           '.1.3.6.1.4.1.9.9.16.1.1.1.5.333', INTEGER, $packetsize
                                          ));

        if (!defined($response)) {
            printf("SNMP ERROR: %s.\n <br>", $session->error());
            $session->close();
            exit 1;
        }

        # start ping
        $response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 1);

        my $finished;
        while ($finished != 1) {
            my $oid;
            $oid = '.1.3.6.1.4.1.9.9.16.1.1.1.14.333';
            $response = $session->get_request($oid);
            $finished = $response->{$oid};
            sleep(1);
        }

        # take a look at the result
        my $sndpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.9.333';
        my $rcvpkts_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.10.333';
        $response = $session->get_request(($sndpkts_oid,$rcvpkts_oid));

        if (!defined($response)) {
            printf("SNMP ERROR: %s.\n <br>", $session->error());
            $session->close();
            exit 1;
        }

        my $sndpkts = $response->{$sndpkts_oid};
        my $rcvpkts = $response->{$rcvpkts_oid};
        my $successrate = $rcvpkts*100/$sndpkts;
        my $avgpingtime;

        if ($rcvpkts > 0) {
            my $avgpingtime_oid = '.1.3.6.1.4.1.9.9.16.1.1.1.12.333';

            $response = $session->get_request(($avgpingtime_oid,$sndpkts_oid,$rcvpkts_oid));

            if (!defined($response)) {
                printf("SNMP ERROR: %s.\n <br>", $session->error());
                $session->close();
                exit 1;
            }
            $avgpingtime = $response->{$avgpingtime_oid};
        } else {
            $avgpingtime = 0;
        }

        print "Average Ping Time = $avgpingtime\nSuccess Rate = $successrate%\n";

        # cleanup
        $response = $session->set_request('.1.3.6.1.4.1.9.9.16.1.1.1.16.333', INTEGER, 6);

        $session->close();


        }              
1;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Al ejecutar este Perl, me devuelve:

Código: Seleccionar todo
Average Ping Time = 82
Success Rate = 100%


o valores parecidos, ok.

Pero ¿qué pasa si $ipaddress es un parámetro tal que así?:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#! /usr/bin/perl
use strict;
use Socket;
use Net::SNMP;


&latencia('200.1.23.100');
exit 0;

sub latencia {

# ...
        my $ipaddress =$_[0];
# ...
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pues que me devuelve esto:

Código: Seleccionar todo
Average Ping Time = 1
Success Rate = 100%


y no consigo entender por qué, ya que si dentro de la función hago un print de $ipaddress ¡me la devuelve igual que la que he escrito!

¿qué puede ser?
¿qué más maneras hay de pasar parámetros?
digitallxd
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2007-07-12 06:40 @319

Publicidad

Notapor explorer » 2007-07-30 06:27 @310

No veo fallo, pero, por probar... prueba con esto:

inet_aton("$ipaddress")

(entrecomillar la variable para stringficarla).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor digitallxd » 2007-07-30 07:53 @370

jolin, pues nop, no funciona :S
digitallxd
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2007-07-12 06:40 @319

Notapor explorer » 2007-07-30 08:00 @375

A ver...

Prueba dentro de la subrutina con esto y nos cuentas qué sale:

print inet_ntoa( inet_aton( $ipaddress ) );
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados