• Publicidad

Desreferenciar referencia

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

Desreferenciar referencia

Notapor natxo » 2010-02-03 15:54 @704

Seguro que es una tontería pero llevo media hora con esto y no me sale.

A ver, necesito sacar información de nuestros servidores de impresión para localizar diferencias en la configuración de las impresoras. Hacerlo a mano es un proceso muy farragoso y poco práctico. Así que he instalado el módulo Win32::Printer y funciona bien, pero no sé sacar la información por las referencias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use strict;
use warnings;
use Win32::Printer::Enum;
use Data::Dumper;

my @printers = Printers();
print Dumper(@printers);
print "$printers[0]{PrinterName}";
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Me saca esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          'UntilTime' => '0',
          'Datatype' => 'RAW',
          'PrinterName' => 'test 2 perl',
          'AveragePPM' => '0',
          'Status' => '0',
          'Jobs' => '0',
          'PortName' => 'XPSPort:',
          'StartTime' => '0',
          'Location' => '',
          'SepFile' => '(null)',
          'ServerName' => '(null)',
          'DefaultPriority' => '0',
          'DriverName' => 'AGFA-AccuSet 1500',
          'Comment' => '',
          'Parameters' => '(null)',
          'PrintProcessor' => 'WinPrint',
          'Attributes' => '576',
          'ShareName' => '',
          'Priority' => '1'
        };
$VAR2 = {
          'UntilTime' => '0',
          'Datatype' => 'RAW',
          'PrinterName' => 'test',
          'AveragePPM' => '0',
          'Status' => '0',
          'Jobs' => '0',
          'PortName' => 'LPT1:',
          'StartTime' => '0',
          'Location' => 'Blabla',
          'SepFile' => '(null)',
          'ServerName' => '(null)',
          'DefaultPriority' => '0',
          'DriverName' => 'AGFA-AccuSetSF v52.3',
          'Comment' => 'bladibla',
          'Parameters' => '(null)',
          'PrintProcessor' => 'WinPrint',
          'Attributes' => '576',
          'ShareName' => '',
          'Priority' => '1'
        };
test 2 perl
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Como veis, tengo 2 impresoras de prueba. Lo que me interesa es hacer un bucle que me saque varios atributos de todas las impresoras. Puedo sacar un atributo de una impresora, pero no sé cómo hacer el bucle. Con las referencias todavía estoy verde, me temo. ¿Me podéis dar alguna pista?
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Publicidad

Re: Desreferenciar referencia

Notapor kidd » 2010-02-03 17:40 @778

El operador que usas para de-referenciar un hash o un array es ->, por lo que deberías de hacer:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print $printers[0]->{PrinterName};
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora, si lo quieres hacer en un bucle, entonces algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @printers = Printers();

for my $printer(@printers){
    print $printer->{PrinterName}, "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cada elemento de @printers es asignado a $printer, que contendrá un hash-ref, es decir la ubicación en memoria del hash, por lo que nada más falta llamar a sus llaves usando el operador ->.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Re: Desreferenciar referencia

Notapor explorer » 2010-02-03 18:00 @792

Además de lo indicado por kidd, aquí tienes otra forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!perl
  2. use strict;
  3. use warnings;
  4.  
  5. use Win32::Printer::Enum;
  6.  
  7. for my $printer_ref (Printers()) {
  8.     my %printer = %{$printer_ref};    # hacemos una copia del hash, des-referenciando
  9.  
  10.     print "$printer{PrinterName}\n";
  11. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Desreferenciar referencia

Notapor natxo » 2010-02-04 13:07 @588

Funcionan ambas soluciones a la perfección. Gracias por su ayuda, he comprendido cómo usar estos módulos (y viendo la cantidad de módulos que hay, conviene entender cómo usarlos, claro).

Como comentario final: sigo sin comprender por qué Perl en plataformas Windows no tiene más aceptación (sobre todo para los administradores de sistemas). Ahora lo que se lleva es Powershell, pero si comparamos el tiempo de ejecución de un script en Perl y otro en Powershell, la verdad es que no hay color, el de Perl funciona de media 3 veces más rápido.

En cuanto a la facilidad de lectura y compresión de un lenguaje u otro, pues no veo que sea más claro Powershell, la verdad.

En fin, me voy por las nubes. Un saludo.
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos


Volver a Básico

¿Quién está conectado?

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