/ / Después de cambiar `use` a` require`, ¿cómo trato con las importaciones? - perl

Después de cambiar `use` por` require`, ¿cómo trato con las importaciones? - perl

Basado en la solución provista en Prueba de existencia de mod perl dentro del script, Se me ocurrió la siguiente prueba:

my @mods = (qw(Cwd DBI Date::Calc Term::ReadLine File::Copy Digest::Perl::MD5
LWP::Simple Switch POSIX Text::LevenshteinXS File::Spec
File::Basename String::CRC32 MIME::Lite IO::Socket::INET));

foreach my $mod (@mods) {
( my $fn = "$mod.pm" ) =~ s|::|/|g;    # Foo::Bar::Baz => Foo/Bar/Baz.pm
if ( eval { require $fn; 1; } ) {
print "Module $mod loaded okn";
} else {
print "Could not load $mod. Error Message: $@n";
}
}

Cuando originalmente solo tenía use something, A veces también tuve importaciones, que ahora encuentro que no funcionarán require, es decir

use Digest::Perl::MD5 "md5_hex";

Después de la @mods prueba, me gustaría cargarlos, así que:

require Cwd;
require DBI;
require Date::Calc;
require Term::ReadLine;
require File::Copy;
require Digest::Perl::MD5 "md5_hex";
require LWP::Simple;
require Switch;
require POSIX;
require Text::LevenshteinXS qw(distance);
require File::Spec;
require File::Basename;
require String::CRC32;
require MIME::Lite;
require IO::Socket::INET;

Pero esto arroja un error en la ejecución:

syntax error at ./mod.pl line 78, near "require Digest::Perl::MD5 "md5_hex""
syntax error at ./mod.pl line 82, near "require Text::LevenshteinXS qw(distance)"

¿Cómo puedo hacer esto?

EDITAR: Para cualquier otra persona que se encuentre con este hilo más adelante, aquí está el código de trabajo:

use strict;

$| = 1;

################################################
# Help user if Perl mods are missing
################################################
my @mods = (qw(DBI Date::Calc Term::ReadLine File::Copy Digest::MD5 LWP::Simple Text::LevenshteinXS File::Spec String::CRC32 MIME::Lite IO::Socket::INET Getopt::Long));

foreach my $mod (@mods) {
( my $fn = "$mod.pm" ) =~ s|::|/|g;    # Foo::Bar::Baz => Foo/Bar/Baz.pm
if ( eval { require $fn; 1; } ) {
##print "Module $mod loaded okn";
} else {
print "You are missing a required Perl Module: $modn";
my $ok = &getYN( "Shall I attempt to install it for you?", "y" );
if ( $ok =~ /[Yy]/ ) {
require CPAN;
CPAN::install($mod);
} else {
print "LogZilla requires $modn";
exit;
}
}
}

use feature "switch";
use Cwd;
use File::Basename;
use POSIX;
require DBI;
require Date::Calc;
require Term::ReadLine;
require File::Copy;
require Digest::MD5->import("md5_hex");
require LWP::Simple;
require Text::LevenshteinXS->import("distance");
require File::Spec;
require String::CRC32;
require MIME::Lite;
require IO::Socket::INET;
require Getopt::Long;

my ($autoyes);

sub getYN {
unless ( $autoyes =~ /[Yy]/ ) {
my ( $prompt, $default ) = @_;
my $defaultValue = $default ? "[$default]" : "";
print "$prompt $defaultValue: ";
chomp( my $input = <STDIN> );
return $input ? $input : $default;
} else {
return "Y";
}
}

sub prompt {
my ( $prompt, $default ) = @_;
my $defaultValue = $default ? "[$default]" : "";
print "$prompt $defaultValue: ";
chomp( my $input = <STDIN> );
return $input ? $input : $default;
}

Respuestas

8 para la respuesta № 1

Debe llamar al método de importación de módulos, p. Ej.

Digest::Perl::MD5->import("md5_hex");
Text::LevenshteinXS->import("distance");

use Module es exactamente equivalente a

 BEGIN { require Module; Module::->import( LIST ); }