• Publicidad

Problemas con módulo Xbase

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

Problemas con módulo Xbase

Notapor joel_viruz » 2009-12-01 17:28 @769

Que tal a todos.

No soy desarrollador de Perl pero estoy utilizando una herramienta ETL (Talend Open Studio) para poder hacer carga de archivos .dbf. El caso es que para esto necesitaba agregar un componente que lo hiciera y esto se hace mediante Perl. Encontré el componente, lo descargué y lo utilicé en el Talend pero cuando quiero correr el Job que hace la carga de los .dbf aparecía el siguiente error:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate Xbase.pm in @INC (@INC contains:
C:/Documents and Settings/Administrator.ALLITYDEV01/Desktop/TOS-All-r28760-V3.2.0M3/workspace/.Perl
C:\Documents and Settings\Administrator.ALLITYDEV01\Desktop\TOS-All-r28760-V3.2.0M3\lib\perl
C:/Documents and Settings/Administrator.ALLITYDEV01/Desktop/TOS-All-r28760-V3.2.0M3/plugins/org.talend.resources_3.2.0.M3_r28760/resources/perl/lib
C:/Documents and Settings/Administrator.ALLITYDEV01/Desktop/TOS-All-r28760-V3.2.0M3/plugins/org.talend.resources_3.2.0.M3_r28760/resources/perl/site/lib .) at
C:\Documents and Settings\Administrator.ALLITYDEV01\Desktop\TOS-All-r28760-V3.2.0M3\workspace\.Perl\DBF_PERL.job_perl_0.1.pl line 278.
BEGIN failed--compilation aborted at
C:\Documents and Settings\Administrator.ALLITYDEV01\Desktop\TOS-All-r28760-V3.2.0M3\workspace\.Perl\DBF_PERL.job_perl_0.1.pl line 278.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Investigando me di cuenta que necesitaba instalar el módulo DBD::Xbase. Para esto instalé ActivePerl y en el PPM hice la instalación de este módulo. Aun así sigue apareciéndome el mismo error. Entonces, en las carpetas que son referenciadas en el error pegué la carpeta que se genera al momento de instalar el módulo (carpeta DBD con el archivo Xbase.pm dentro junto con otros archivos), volví a intentar correr el Job y ahora me marcó lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Can't locate object method "new" via package "Xbase" (perhaps you forgot to load "Xbase"?) at C:\TOS-Win32-r31371-V3.2.1\workspace\.Perl\DBF_PERL.job_dbf_0.1.pl line 417.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Para esto, revisé el archivo del Job y en la línea marcada dice lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#...
my $nb_fields_tFileInputXbase_1 = scalar @{ $desc_tFileInputXbase_1{schema} };
my $dbf_tFileInputXbase_1 = new XBase; 
$dbf_tFileInputXbase_1->open_dbf($desc_tFileInputXbase_1{filename});
$nb_line_tFileInputXbase_1 = 0;
my $total_line_tFileInputXbase_1 = $dbf_tFileInputXbase_1->lastrec;
#...
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Aquí es donde me he quedado atorado porque a lo que entiendo es cuestión del código de Perl que algo le esté faltando. Si alguien sabe y pudiera ayudarme se lo agradecería mucho.

Estas pruebas las estoy realizando en Windows XP Professional SP2 y posteriormente sería hacerlo en un equipo con Windows 2003 Server.

Saludos y gracias de antemano.
Última edición por explorer el 2009-12-01 19:56 @872, editado 2 veces en total
Razón: Ortografía, estilo, bloques de código
joel_viruz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-12-01 13:43 @613

Publicidad

Re: Problemas con módulo DBD::Xbase

Notapor explorer » 2009-12-01 18:13 @801

Bienvenido a los foros de Perl en Español, joel_viruz.

Si usas una distribución Perl como la de ActiveState, no tienes que hacer operaciones raras como la de "mover" la carpeta creada en la instalación de los módulos. Tú solo tienes que preocuparte de hacer la instalación con el PPM y listo. Para comprobar si un módulo está bien instalado solo tienes que ejecutar una línea como esta:

perl -MXBase -e 1

cambiando XBase por el módulo que quieras probar. Si no sale ningún mensaje, es que todo va bien.

Por el trozo de código que has puesto, me suena a que no se trata de DBD::XBase, sino del módulo XBase. Si miras la distribución de DBD::XBase verás que son distintos. El primero, DBD::Xbase, es para usarlo desde el DBI, mientras que el segundo, XBase es para acceder a los ficheros dbf de forma directa.

El segundo mensaje de error me hace pensar que el programa no tiene ninguna línea que importe el módulo, es decir, que no hay ninguna línea parecida a esta:

use XBase;

(vamos, como aparece en la sección Sinopsis de la página de documentación de XBase).

Y... un detalle importante...

Tampoco es lo mismo el módulo Xbase que el módulo XBase :o

El Xbase es de 1996, mientras que el XBase, el que pertenece a la distribución DBD::XBase, es de 2003.

Según los dos mensajes de error, necesitas el primero, no el segundo. Pero en el trozo de código haces referencia a XBase... ¡vaya lío!
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con módulo DBD::Xbase

Notapor joel_viruz » 2009-12-01 19:00 @833

Qué tal, explorer, gracias por contestarme.

Sí, de hecho si había visto que DBD::XBase y Xbase eran distintos; instalé ambos módulos (te adjunto una imagen del PPM donde aparecen los dos).

Verifiqué el módulo con la instrucción que me pusiste y no hay ningún problema. Al parecer, según lo que dices está bien instalado.

En cuanto a que XBase y Xbase eran diferentes no tenía idea; sí fue error mio ahí; el programa me lo maneja como Xbase y es el que veo que tengo instalado en el PPM; aun así ya teniendo todo como Xbase sigue el mismo problema.

Referente al programa que no tiene la línea que importa el módulo,

use Xbase;

sí la trae, la línea es la 275. Ahora te pego el código que me genera el Talend para el Job.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. =head1 testdbf
  4. Job testdbf, version 0.1, status .
  5. Purpose:
  6.  
  7. =cut
  8.  
  9. use talend::runstat;
  10. use routines::system::Date;
  11. use routines::system::Misc;
  12. use routines::system::Numeric;
  13. use routines::system::String;
  14.  
  15. my $_licence = <<'END_OF_LICENCE';
  16.  
  17.  Copyright (c) 2005-2008, Talend Inc.
  18.  
  19.  =
  20.  / JobDesigner (CodeGenerator version 3.2.1.r31371).
  21.  You can find more information about Talend products at http://www.talend.com.
  22.  You may distribute this code under the terms of the GNU LGPL license
  23.  (http://www.gnu.org/licenses/lgpl.html).
  24.  
  25. END_OF_LICENCE
  26.  
  27. # print $_licence;
  28.  
  29. use Getopt::Long;
  30. use Time::HiRes qw/gettimeofday tv_interval time/;
  31. my %opt = ();
  32. GetOptions(
  33.     \%opt,
  34.     (
  35.         'context=s',
  36.         'stat_port=i',
  37.         'trace_port=i',
  38.         'client_host=s',
  39.         'watch',
  40.         'pid=s',
  41.         'father_pid=s',
  42.         'root_pid=s',
  43.         'context_param=s%',
  44.         'context_param_encoding=s',
  45.     )
  46. );
  47.  
  48. $defaultClientHost = "127.0.0.1";
  49. $clientHost = $opt{client_host} ? $opt{client_host} : $defaultClientHost;
  50.        
  51.  
  52. our %_context;
  53. our %_globals;
  54.  
  55. $_globals{pid} = defined $opt{pid}
  56.     ? $opt{pid}
  57.     : getRandomString(6, ['a'..'z', 'A'..'Z', 0..9])
  58. ;
  59.  
  60. $_globals{father_pid} = defined $opt{father_pid}
  61.     ? $opt{father_pid}
  62.     : $_globals{pid}
  63. ;
  64.  
  65. $_globals{root_pid} = defined $opt{root_pid}
  66.     ? $opt{root_pid}
  67.     : $_globals{pid}
  68. ;
  69.  
  70. $_globals{job_name} = 'testdbf';
  71. $_globals{job_repository_id} = '__10BsN4yEd6HpvTRZtNZmA';
  72. $_globals{job_version} = '0.1';
  73. $_globals{system_pid} = $$;
  74. $_globals{project_name} = 'DBF_PERL';
  75. $_globals{start} = [gettimeofday];
  76. $_globals{job_execution_datetime} = getDate('CCYY-MM-DD hh:mm:ss');
  77.  
  78. if (defined $opt{context}) {
  79.     my $context_filename =
  80.         $_globals{project_name}
  81.         .'.job_'.$_globals{job_name}
  82.         .'_'.$_globals{job_version}
  83.         .'_'.$opt{context}
  84.         .'.pl'
  85.     ;
  86.  
  87.     use FindBin;
  88.     use lib $FindBin::Bin;
  89.     require $context_filename;
  90. }
  91.  
  92. if (defined $opt{context_param}) {
  93.     my $cb = undef;
  94.  
  95.     if (defined $opt{context_param_encoding}) {
  96.         require Convert::BaseN;
  97.         $cb = Convert::BaseN->new(base => $opt{context_param_encoding});
  98.     }
  99.  
  100.     foreach my $key (keys %{ $opt{context_param} }) {
  101.         my $raw_value = $opt{context_param}{$key};
  102.         $_context{$key} = defined $cb ? $cb->decode($raw_value) : $raw_value;
  103.     }
  104. }
  105.  
  106. use constant true   => 1;
  107. use constant false  => 0;
  108. use constant null   => undef;
  109.  
  110. $SIG{__DIE__} = \&global_die_catcher;
  111. $current_component = undef;
  112.  
  113.  
  114. $current_component = undef;
  115.  
  116. sub global_die_catcher {
  117.     # go away if we are inside an eval
  118.     return if $^S;
  119.  
  120.     our $_globals;
  121.     $_globals{job_failure} = 1;
  122.  
  123.     if (defined $current_component) {
  124.         my $dying_component = $current_component;
  125.  
  126.         my $exception = $_[0];
  127.         chomp($exception);
  128.  
  129.         $_globals{$dying_component}{ERROR_MESSAGE} = $exception;
  130.  
  131.         no strict 'refs';
  132.         &{$dying_component.'_error'}();
  133.     }
  134.  
  135.  
  136.  
  137.     # if the error was catched, we say to the father job that everything is OK
  138.     if ($_globals{job_failure} == 0) {
  139.         exit(0);
  140.     }
  141. }
  142.  
  143. # OnComponentError dedicated subs for all components of the job design
  144. sub tFileInputXbase_1_error() {
  145.  
  146.     # even if the error was "catched" in an OnComponentError, we call the
  147.     # corresponding OnSubjobError sub
  148.     tFileInputXbase_1_onSubjobError();
  149. }
  150. sub tLogRow_1_error() {
  151.  
  152.     # even if the error was "catched" in an OnComponentError, we call the
  153.     # corresponding OnSubjobError sub
  154.     tFileInputXbase_1_onSubjobError();
  155. }
  156.  
  157. # OnSubjobError dedicated subs for all components responsible (starting) a
  158. # subjob
  159. sub tFileInputXbase_1_onSubjobError() {
  160. }
  161.  
  162. # +-------------------------------------------------------------------------+
  163. # | [subprocess header] starts here                                         |
  164. # +-------------------------------------------------------------------------+
  165.  
  166.         sub tFileInputXbase_1_subprocess  {
  167. # +-------------------------------------------------------------------------+
  168. # | [subprocess header] stops here                                          |
  169. # +-------------------------------------------------------------------------+
  170.  
  171.  
  172.  
  173. # +-------------------------------------------------------------------------+
  174. # | [tLogRow_1 begin ] start
  175. # +-------------------------------------------------------------------------+
  176.  
  177. $current_component="tLogRow_1";
  178.  
  179.  
  180.  
  181. =head1 tLogRow tLogRow_1
  182.  
  183. =cut
  184.  
  185. $_globals{tLogRow_1}{OK} = false;
  186. $_globals{tLogRow_1}{start} = [gettimeofday];
  187.  
  188. $count_row1 = 0;
  189. $last_stat_update_of_row1 = time();
  190. SendStat(
  191.     'row1'.(defined $exec_number ? '.'.$exec_number : ''),
  192.     $count_row1,
  193.     0,
  194.     'start'
  195. );
  196.  
  197.  
  198. my %desc_tLogRow_1 = (
  199.     schema        => [
  200.         {
  201.             name    => 'ord_num',
  202.         },
  203.         {
  204.             name    => 'cust_num',
  205.         },
  206.         {
  207.             name    => 'evtdate',
  208.         },
  209.         {
  210.             name    => 'bookdate',
  211.         },
  212.         {
  213.             name    => 'status',
  214.         },
  215.         {
  216.             name    => 'partyname',
  217.         },
  218.         {
  219.             name    => 'theme',
  220.         },
  221.         {
  222.             name    => 'salesrep',
  223.         },
  224.         {
  225.             name    => 'category',
  226.         },
  227.         {
  228.             name    => 'plnguests',
  229.         },
  230.         {
  231.             name    => 'subtotal',
  232.         },
  233.         {
  234.             name    => 'tax',
  235.         },
  236.         {
  237.             name    => 'servchg',
  238.         },
  239.         {
  240.             name    => 'paid',
  241.         },
  242.     ],
  243. );
  244.  
  245. my @colnames_tLogRow_1 = map {$_->{name}} @{ $desc_tLogRow_1{schema} };
  246. my @collengths_tLogRow_1 = map {$_->{printLength}} @{ $desc_tLogRow_1{schema} };
  247. my $line_num_tLogRow_1 = 0;
  248.  
  249.  
  250.  
  251. # +-------------------------------------------------------------------------+
  252. # | [tLogRow_1 begin ] stop
  253. # +-------------------------------------------------------------------------+
  254.  
  255.  
  256. # +-------------------------------------------------------------------------+
  257. # | [tFileInputXbase_1 begin ] start
  258. # +-------------------------------------------------------------------------+
  259.  
  260. $current_component="tFileInputXbase_1";
  261.  
  262.  
  263.  
  264. =head1 tFileInputXbase tFileInputXbase_1
  265.  
  266. =cut
  267.  
  268. $_globals{tFileInputXbase_1}{OK} = false;
  269. $_globals{tFileInputXbase_1}{start} = [gettimeofday];
  270.  
  271.  
  272.                                                                 use FileHandle;
  273.                                                                 use List::Util qw/min/;
  274.                                                                 use Xbase;
  275.                                                                 use talend::filesOp;
  276.  
  277.                                                                 my %desc_tFileInputXbase_1 = (
  278.                                                                   filename      => 'C:/Documents and Settings/Administrador/Escritorio/Meson/EVENTS.DBF',
  279.                                                                   header        => 0,
  280.                                                                   footer        => 0,
  281.                                                                   limit         => null,
  282.                                                                   schema        => [
  283.                                                                     {
  284.                                                                       name    => 'ord_num',
  285.                                                                       key     => false,
  286.                                                                       type    => '',
  287.                                                                       len     => null,
  288.                                                                       null    => true,
  289.                                                                       default => '',
  290.                                                                       comment => '',
  291.                                                                     },
  292.                                                                     {
  293.                                                                       name    => 'cust_num',
  294.                                                                       key     => false,
  295.                                                                       type    => '',
  296.                                                                       len     => null,
  297.                                                                       null    => true,
  298.                                                                       default => '',
  299.                                                                       comment => '',
  300.                                                                     },
  301.                                                                     {
  302.                                                                       name    => 'evtdate',
  303.                                                                       key     => false,
  304.                                                                       type    => '',
  305.                                                                       len     => null,
  306.                                                                       null    => true,
  307.                                                                       default => '',
  308.                                                                       comment => '',
  309.                                                                     },
  310.                                                                     {
  311.                                                                       name    => 'bookdate',
  312.                                                                       key     => false,
  313.                                                                       type    => '',
  314.                                                                       len     => null,
  315.                                                                       null    => true,
  316.                                                                       default => '',
  317.                                                                       comment => '',
  318.                                                                     },
  319.                                                                     {
  320.                                                                       name    => 'status',
  321.                                                                       key     => false,
  322.                                                                       type    => '',
  323.                                                                       len     => null,
  324.                                                                       null    => true,
  325.                                                                       default => '',
  326.                                                                       comment => '',
  327.                                                                     },
  328.                                                                     {
  329.                                                                       name    => 'partyname',
  330.                                                                       key     => false,
  331.                                                                       type    => '',
  332.                                                                       len     => null,
  333.                                                                       null    => true,
  334.                                                                       default => '',
  335.                                                                       comment => '',
  336.                                                                     },
  337.                                                                     {
  338.                                                                       name    => 'theme',
  339.                                                                       key     => false,
  340.                                                                       type    => '',
  341.                                                                       len     => null,
  342.                                                                       null    => true,
  343.                                                                       default => '',
  344.                                                                       comment => '',
  345.                                                                     },
  346.                                                                     {
  347.                                                                       name    => 'salesrep',
  348.                                                                       key     => false,
  349.                                                                       type    => '',
  350.                                                                       len     => null,
  351.                                                                       null    => true,
  352.                                                                       default => '',
  353.                                                                       comment => '',
  354.                                                                     },
  355.                                                                     {
  356.                                                                       name    => 'category',
  357.                                                                       key     => false,
  358.                                                                       type    => '',
  359.                                                                       len     => null,
  360.                                                                       null    => true,
  361.                                                                       default => '',
  362.                                                                       comment => '',
  363.                                                                     },
  364.                                                                     {
  365.                                                                       name    => 'plnguests',
  366.                                                                       key     => false,
  367.                                                                       type    => '',
  368.                                                                       len     => null,
  369.                                                                       null    => true,
  370.                                                                       default => '',
  371.                                                                       comment => '',
  372.                                                                     },
  373.                                                                     {
  374.                                                                       name    => 'subtotal',
  375.                                                                       key     => false,
  376.                                                                       type    => '',
  377.                                                                       len     => null,
  378.                                                                       null    => true,
  379.                                                                       default => '',
  380.                                                                       comment => '',
  381.                                                                     },
  382.                                                                     {
  383.                                                                       name    => 'tax',
  384.                                                                       key     => false,
  385.                                                                       type    => '',
  386.                                                                       len     => null,
  387.                                                                       null    => true,
  388.                                                                       default => '',
  389.                                                                       comment => '',
  390.                                                                     },
  391.                                                                     {
  392.                                                                       name    => 'servchg',
  393.                                                                       key     => false,
  394.                                                                       type    => '',
  395.                                                                       len     => null,
  396.                                                                       null    => true,
  397.                                                                       default => '',
  398.                                                                       comment => '',
  399.                                                                     },
  400.                                                                     {
  401.                                                                       name    => 'paid',
  402.                                                                       key     => false,
  403.                                                                       type    => '',
  404.                                                                       len     => null,
  405.                                                                       null    => true,
  406.                                                                       default => '',
  407.                                                                       comment => '',
  408.                                                                     },
  409.                                                                   ]
  410.                                                                 );
  411.                                                                 my $nb_fields_tFileInputXbase_1 = scalar @{ $desc_tFileInputXbase_1{schema} };
  412.  
  413.                                                                 my $dbf_tFileInputXbase_1 = new Xbase;
  414.                                                                 $dbf_tFileInputXbase_1->open_dbf($desc_tFileInputXbase_1{filename});
  415.                                                                 $nb_line_tFileInputXbase_1 = 0;
  416.                                                                 my $total_line_tFileInputXbase_1 = $dbf_tFileInputXbase_1->lastrec;
  417.  
  418.                                                                 my ($first_row_tFileInputXbase_1, $last_row_tFileInputXbase_1) = getFirstAndLastRowNumber(
  419.                                                                   header  => $desc_tFileInputXbase_1{header},
  420.                                                                   footer  => $desc_tFileInputXbase_1{footer},
  421.                                                                   limit   => $desc_tFileInputXbase_1{limit},
  422.                                                                   total   => $total_line_tFileInputXbase_1,
  423.                                                                 );
  424.  
  425.                                                                 $first_row_tFileInputXbase_1 = $first_row_tFileInputXbase_1 - 1;
  426.                                                                 $last_row_tFileInputXbase_1 = $last_row_tFileInputXbase_1 -1;
  427.  
  428.                                                                 $dbf_tFileInputXbase_1->go_top;
  429. ######loop
  430.                                                                 if ($first_row_tFileInputXbase_1 > 0) {
  431.                                                                   for (0 .. $first_row_tFileInputXbase_1-1) {
  432.                                                                     $dbf_tFileInputXbase_1->go_next;
  433.                                                                   }
  434.                                                                 }
  435.  
  436.                                                                 for ($first_row_tFileInputXbase_1 .. $last_row_tFileInputXbase_1) {
  437.                                                                   @fields = $dbf_tFileInputXbase_1->get_record;
  438.                                                                   my @line_tFileInputXbase_1 = ();
  439.                                                                   $nb_line_tFileInputXbase_1++;
  440.  
  441.                                                                   $dbf_tFileInputXbase_1->go_next;
  442.  
  443.                                                                   my $tFileInputXbase_1 = [(@fields)[0 .. $nb_fields_tFileInputXbase_1 - 1]];
  444.  
  445. # +-------------------------------------------------------------------------+
  446. # | [tFileInputXbase_1 begin ] stop
  447. # +-------------------------------------------------------------------------+
  448.  
  449. # +-------------------------------------------------------------------------+
  450. # | [tFileInputXbase_1 main ] start
  451. # +-------------------------------------------------------------------------+
  452.  
  453. $current_component="tFileInputXbase_1";
  454.  
  455.  
  456.  
  457. my $row1 = $tFileInputXbase_1;
  458. # +-------------------------------------------------------------------------+
  459. # | [tFileInputXbase_1 main ] stop
  460. # +-------------------------------------------------------------------------+
  461.  
  462.  
  463.  
  464. # +-------------------------------------------------------------------------+
  465. # | [tLogRow_1 main ] start
  466. # +-------------------------------------------------------------------------+
  467.  
  468. $current_component="tLogRow_1";
  469.  
  470.  
  471. $now = time();
  472. $count_row1++;
  473. if ($now - $last_stat_update_of_row1 >= 2) {
  474.     $last_stat_update_of_row1 = $now;
  475.     my $duration = int(
  476.         1000 * tv_interval(
  477.             $_globals{tLogRow_1}{start},
  478.             [gettimeofday]
  479.         )
  480.     );
  481.     SendStat(
  482.         'row1'.(defined $exec_number ? '.'.$exec_number : ''),
  483.         $count_row1,
  484.         $duration
  485.     );
  486. }
  487.  
  488. my $tLogRow_1 = $row1;
  489.  
  490. $line_num_tLogRow_1++;
  491.  
  492. $colnum1 = 0;
  493. $colnum2 = 0;
  494.  
  495. print STDOUT (
  496.     join(
  497.         '|',
  498.                 @$tLogRow_1
  499.     ),
  500.     "\n"
  501. )
  502.     or die "[tLogRow_1] can't print to STDOUT\n";
  503.  
  504.  
  505. # +-------------------------------------------------------------------------+
  506. # | [tLogRow_1 main ] stop
  507. # +-------------------------------------------------------------------------+
  508.  
  509. # +-------------------------------------------------------------------------+
  510. # | [                                                                       |
  511. # +-------------------------------------------------------------------------+
  512.  
  513.  
  514. # +-------------------------------------------------------------------------+
  515. # | [tFileInputXbase_1 end ] start
  516. # +-------------------------------------------------------------------------+
  517.  
  518. $current_component="tFileInputXbase_1";
  519.  
  520.  
  521.  
  522. }
  523. $_globals{tFileInputXbase_1}{NB_LINE} = $nb_line_tFileInputXbase_1;
  524.  
  525.  
  526. $_globals{tFileInputXbase_1}{OK} = true;
  527.  
  528.  
  529. # +-------------------------------------------------------------------------+
  530. # | [tFileInputXbase_1 end ] stop
  531. # +-------------------------------------------------------------------------+
  532.  
  533.  
  534.  
  535. # +-------------------------------------------------------------------------+
  536. # | [tLogRow_1 end ] start
  537. # +-------------------------------------------------------------------------+
  538.  
  539. $current_component="tLogRow_1";
  540.  
  541.  
  542.     $duration = int(
  543.         1000 * tv_interval(
  544.             $_globals{tLogRow_1}{start},
  545.             [gettimeofday]
  546.         )
  547.     );
  548. SendStat(
  549.     'row1'.(defined $exec_number ? '.'.$exec_number : ''),
  550.     $count_row1,
  551.     $duration,
  552.     'stop'
  553. );
  554.  
  555.  
  556.  
  557.  
  558. $_globals{tLogRow_1}{OK} = true;
  559.  
  560.  
  561. # +-------------------------------------------------------------------------+
  562. # | [tLogRow_1 end ] stop
  563. # +-------------------------------------------------------------------------+
  564.  
  565. # +-------------------------------------------------------------------------+
  566. # | [subprocess footer] starts here                                         |
  567. # +-------------------------------------------------------------------------+
  568.         }
  569. # +-------------------------------------------------------------------------+
  570. # | [subprocess footer] stops here                                          |
  571. # +-------------------------------------------------------------------------+
  572.  
  573. # +-------------------------------------------------------------------------+
  574. # | [footer] starts here                                                    |
  575. # +-------------------------------------------------------------------------+
  576.  
  577. StartStat($opt{stat_port}, $clientHost) if defined $opt{stat_port};
  578.  
  579. my $pid = undef;
  580.  
  581. tFileInputXbase_1_subprocess();
  582.  
  583. $_globals{stop} = [gettimeofday];
  584.  
  585. $_globals{duration} = int(
  586.     tv_interval(
  587.         $_globals{start},
  588.         $_globals{stop}
  589.     )
  590.     * 1000
  591. );
  592.  
  593.  
  594.  
  595. if (defined $opt{watch}) {
  596.     printf(
  597.         "===\nexecution time: %u milliseconds\n===\n",
  598.         $_globals{duration}
  599.     );
  600. }
  601.  
  602. sub wait_for_a_kid
  603. {
  604.   my $pid = wait;
  605.   return 0 if $pid < 0;
  606.   1;
  607. }
  608.  
  609. # +-------------------------------------------------------------------------+
  610. # | [footer] stops here                                                     |
  611. # +-------------------------------------------------------------------------+
  612. # +-------------------------------------------------------------------------+
  613. #      16.646 characters generated by Talend Open Studio
  614. #      on the 1 de diciembre de 2009 4:36:46 GMT
  615. # +-------------------------------------------------------------------------+
Coloreado en 0.014 segundos, usando GeSHi 1.0.8.4
Adjuntos
ppm.JPG
Modulos instalados- DBD::XBase y Xbase
ppm.JPG (53.4 KiB) Visto 810 veces
Última edición por explorer el 2009-12-01 19:28 @852, editado 1 vez en total
Razón: Ortografía, bloques de código
joel_viruz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-12-01 13:43 @613

Re: Problemas con módulo DBD::Xbase

Notapor explorer » 2009-12-01 19:53 @870

Para comprobar que un código está, aparentemente bien, te vale con pasar el código por la fase de compilación del intérprete:

perl -c testdbf.pl

Si todo va bien, devolverá un Ok.

Mirando el código, parece que está bien, no veo nada raro...

Lo que puedes intentar es ejecutarlo paso a paso con el depurador integrado (perl -d), y llegar a la línea que falla. Pero antes de ejecutarla, saca el valor de la variable especial %INC, que almacena los módulos y librerías que el programa ha cargado. Si el error es el mismo que antes, es que no ha cargado el módulo Xbase.

Prueba con algo sencillo como

perl -le "use Xbase; $db = new Xbase"

Si sale el error de que no lo encuentra, quizás esté mal instalado, o en sitio distinto al que la variable de entorno PERL5LIB indica.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Problemas con módulo Xbase

Notapor joel_viruz » 2009-12-02 11:55 @538

Hola explorer,

Probé la instrucción que me dices

perl -c testdbf.pl

para verificar si el código está bien y me marco error de "Can`t locate talend/runstat.pm in @INC..." (adjunto la imagen). ¿talend/runstat.pm es otro módulo que debería instalar?

Sobre verificar la variable especial %INC, ¿cómo puedo verificarla? he estado buscando respecto a eso y no he encontrado qué instrucción me muestre su valor o dónde es que la puedo encontrar.

Esta otra instrucción:

perl -le "use Xbase; $db = new Xbase"

la puse y no mostró ningún error como lo muestra la imagen adjunta.

Oye y lo de la variable de entorno estaba revisando y no me aparece la variable PERL5LIB, sin embargo está una variable PATH que tiene ruta de Perl, ¿será esto un problema? ¿Debo agregar esa variable PERL5LIB? Si debo agregarla, ¿a dónde la direccionaria?
Adjuntos
perl3.JPG
perl3.JPG (42.55 KiB) Visto 788 veces
perl2.JPG
perl2.JPG (15.15 KiB) Visto 788 veces
perl.JPG
perl.JPG (36.7 KiB) Visto 788 veces
joel_viruz
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2009-12-01 13:43 @613

Re: Problemas con módulo Xbase

Notapor explorer » 2009-12-02 12:22 @557

Todos los mensajes de que no encuentra los módulos no quiere decir que debas instalarlos. A lo mejor ya están instalados, pero Perl no los encuentra porque no están en ninguno de los directorios indicados por la variable @INC.

Si ejecutas Perl -V, te mostrará el contenido de dicha variable, para que veas dónde mira por librerías un programa cualquiera.

En caso de error, Perl te avisa de que no ha podido localizar el módulo en ninguno de los directorios de @INC (y te los muestra).

Primero, debes localizar dónde está ese módulo en tu ordenador. Luego, puedes ejecutar el programa Perl dándole la pista para que encuentre al módulo. Puedes hacerlo de forma externa con

perl -I/directorio/donde/reside/el/modulo programa.pl

desde la línea de comandos (más información en perlrun), o de forma interna, con el uso de

use lib '/directorio/donde/reside/el/modulo';

dentro del programa, o a través del entorno del sistema operativo, definiendo la variable de entorno

PERL5LIB="/directorio/donde/reside/el/modulo;C:/otro/directorio"

(Más información en perldoc perlrun).

Para comprobar que estos directorios son efectivamente leídos por el programa, escribes dentro de él

print "$_\n" for @INC;


Para sacar los valores de %INC te vale con poner, dentro del programa, la línea

printf "%6d: %s\n", -s, $_ for sort values %INC;

Recuerda: @INC son los directorios que Perl tiene que visitar para encontrar los módulos, mientras que %INC guarda los módulos que ha conseguido leer y cargar.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
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

cron