• Publicidad

Cómo usar Tie::File en varios subs?

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Cómo usar Tie::File en varios subs?

Notapor creating021 » 2006-06-14 16:58 @749

Saludos.
Cómo puedo usar File::Tie y OO para unificarlo en un módulo?
Me explico:
Tengo el "sub new" que me crea el objeto, y otro sub que me hace el tie, pero si lo quiero usar en otro sub el array no encuentro forma de hacerlo, ya que si hago un "$obj->{Array} = \@array" pierde la idea de File::Tie, dejaría de ser array.
De antemano, gracias!
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Publicidad

Notapor kidd » 2006-06-14 22:38 @985

Hola:

Por qué no pones el código de tu módulo así podremos conocer mejor lo que estás intentando hacer y ayudarte.


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

Notapor creating021 » 2006-06-15 16:00 @708

Si, claro:
Código: Seleccionar todo
#....
sub new {
  my ($pkg, $nam) = @_;
  my $delf = {};
  $self->{OO} = $name;
  bless($self, $pkg);
  return $self;
}
sub Open {
  my $oo = shift;
  my  @array;
  tie @array, 'Tie::File', $oo->{OO} or die "$file->{OO}: $!";
  $oo->{Title} = $array[42];
  #....
}

Ahí la pregunta es como hacer un return al array, manteniendolo en tie y como un array para poder modificar algunas líneas en otro sub.
Simplemete llamo cada funcion de Tie::File en diferentes subs.
La idea es hacer una pequeña "base de datos" para un spider.
Gracias!
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor kidd » 2006-06-15 17:51 @785

Hola:

Lo que debes de hacer es usar una referencia de tu array, por ejemplo:

Código: Seleccionar todo
sub Open {
  my $oo = shift;
  my  @array;
  tie @array, 'Tie::File', $oo->{OO} or die "$file->{OO}: $!";
  $oo->{Title} = $array[42];

  otraFuncion(\@array);
}


sub otraFuncion{
    my $ref_array = shift; #Una referencia a tu array

    print $ref_array->[42]
}



¿Qué es una referencia?

Las referencias las usamos en casos como esto, en donde no queremos una copia de nuestra variable sino acceso a la variable en sí. Entonces de ésta manera cualquier modificación que hagas la estás haciendo en tu variable original.


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

Notapor Perl user » 2006-06-16 09:32 @439

creating021 escribiste:Si, claro:
Código: Seleccionar todo
#....
sub new {
  my ($pkg, $nam) = @_;
  my $delf = {};
  $self->{OO} = $name;
  bless($self, $pkg);
  return $self;
}
sub Open {
  my $oo = shift;
  my  @array;
  tie @array, 'Tie::File', $oo->{OO} or die "$file->{OO}: $!";
  $oo->{Title} = $array[42];
  #....
}

Ahí la pregunta es como hacer un return al array, manteniendolo en tie y como un array para poder modificar algunas líneas en otro sub.
Simplemete llamo cada funcion de Tie::File en diferentes subs.
La idea es hacer una pequeña "base de datos" para un spider.
Gracias!


Que tal,

Creo que lo que intentas hacer es almacenar tu Tie dentro del objeto para que persista durante la vida de él y poder acceder al Tie en cualquier otro método.

Hay 2 variantes que se me ocurren, la primera, la mas "sencilla" de concebir, es almacenando una referencia al tie dentro de tu objeto, ya que es como normalmente manejas los atributos de instancia en Perl. La segunda es que tu objeto realmente sea el Tie, ejemplo para este caso lo encuentras en "Object Oriented Perl" de Damian Conway y técnicas similares.

La solución al primero sería algo como esto:
Código: Seleccionar todo
package TieDB;

use strict;
use warnings;
use Tie::File;

sub new {
    my ( $class, $file ) = @_;
    return bless { file => $file }, $class;
}

sub open {
    my ( $self ) = @_;
    tie my @file, 'Tie::File', $self->{file} or die $!;
    $self->{tie} = \@file;
    print $self->{tie}[-1];  # imprimimos la ultima linea
}

sub close {
    my ( $self ) = @_;
    untie @{ $self->{tie} };
}

1;


Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor creating021 » 2006-06-17 21:29 @937

Perfecto, muchas gracias eso es lo que necesito :mrgreen:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Intermedio

¿Quién está conectado?

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

cron