我有一个使用模块的程序,该模块位于可执行文件所在的文件夹中,但是当我执行它时它只会关闭。
use strict;
use warnings;
use genLetras;
for my $k (1 .. 30 ) {
for my $j (1 .. 30 ) {
genLetras::generarLetra();
$matriz[$k][$j] = genLetras::generarLetra();
}
}
for my $i (1 .. 30 ) {
for my $j (1 .. 30 ) {
print "[$matriz[$k][$j]] ";
}
print "\n";
}
<>;
这是可执行文件的代码。
这是模块的一个
use strict;
use warnings;
use Math::Complex;
my $seed = time();
my $a = $seed / 5;
my $c = $seed - 7;
my $x = $seed;
my $m = sqrt($seed % 574) + $seed;
my $numAleatorio;
sub generadorMultiplicativo{
$numAleatorio = ((($a*$x) + $c) % $m);
$x = $numAleatorio;
}
my $letra;
my $residuo;
sub generarLetra{
for my $i(1..30){
generadorMultiplicativo();
$residuo = $x/$m;
if($residuo < 0.0384615384615385 ){
$letra = 'A';
}
if($residuo > 0.0384615384615385 && $residuo < 0.076923076923077){
$letra = 'B';
}
if($residuo > 0.076923076923077 && $residuo < 0.1153846153846154){
$letra = 'C';
}
if($residuo > 0.1153846153846154 && $residuo < 0.1538461538461538){
$letra = 'D';
}
if($residuo > 0.1538461538461538 && $residuo < 0.1923076923076923){
$letra = 'E';
}
if($residuo > 0.1923076923076923 && $residuo < 0.2307692307692308){
$letra = 'F';
}
if($residuo > 0.2307692307692308 && $residuo < 0.2692307692307692){
$letra = 'G';
}
if($residuo > 0.2692307692307692 && $residuo < 0.3076923076923077 ){
$letra = 'H';
}
if($residuo > 0.3076923076923077 && $residuo < 0.3461538461538462){
$letra = 'I';
}
if($residuo > 0.3461538461538462 && $residuo < 0.3846153846153846){
$letra = 'J';
}
if($residuo > 0.3846153846153846 && $residuo < 0.4230769230769231){
$letra = 'K';
}
if($residuo > 0.4230769230769231 && $residuo < 0.4615384615384615){
$letra = 'L';
}
if($residuo > 0.4615384615384615 && $residuo < 0.5){
$letra = 'M';
}
if($residuo > 0.4615384615384615 && $residuo < 0.5384615384615385){
$letra = 'N';
}
if($residuo > 0.5384615384615385 && $residuo < 0.5769230769230769){
$letra = 'O';
}
if($residuo > 0.5769230769230769 && $residuo < 0.6153846153846154){
$letra = 'P';
}
if($residuo > 0.6153846153846154 && $residuo < 0.6538461538461538){
$letra = 'Q';
}
if($residuo > 0.6538461538461538 && $residuo < 0.6923076923076923){
$letra = 'R';
}
if($residuo > 0.6923076923076923 && $residuo < 0.7307692307692308){
$letra = 'S';
}
if($residuo > 0.7307692307692308 && $residuo < 0.7692307692307692){
$letra = 'T';
}
if($residuo > 0.7692307692307692 && $residuo < 0.8076923076923077){
$letra = 'U';
}
if($residuo > 0.8076923076923077 && $residuo < 0.8461538461538462){
$letra = 'V';
}
if($residuo > 0.8461538461538462 && $residuo < 0.8846153846153846){
$letra = 'W';
}
if($residuo > 0.8846153846153846 && $residuo < 0.9230769230769231){
$letra = 'X';
}
if($residuo > 0.9230769230769231 && $residuo < 0.9615384615384615){
$letra = 'Y';
}
if($residuo > 0.9615384615384615 && $residuo < 1){
$letra = 'Z';
}
return;
}
}
我已经使用perl-c,perl -V进行了编译,所有人都说这是正确的。
我在Windows 10上使用ActivePerl 5.20
答案 0 :(得分:2)
在测试期间,您可能将当前目录设置为脚本所在的目录。找到该模块是因为模块搜索路径(@INC
)包含.
。
当它失败时,当前目录可能被设置为其他目录。无法找到该模块,因为@INC
没有包含它所在的目录。
添加以下内容以将脚本的目录添加到@INC
:
use FindBin qw( $RealBin );
use lib $RealBin;
答案 1 :(得分:2)
这里要考虑四件事:
genLetras.pm
。主脚本必须找到它。像@ikegami在his answer中建议并添加
use FindBin qw( $RealBin );
use lib $RealBin;
在use genLetras;
行之前。
模块必须以一些 true 值结束,否则加载器会抱怨。 添加行
1;
作为模块的最后一行。
package genLetras;
作为第一行。添加它。模块名称 - 按照惯例 - 通常以大写字母开头,如GenLetras
,因为
小写字母是为pragma保留的(例如warnings
或strict
)。
我通常使用FindBin
:
use FindBin;
use lib $FindBin::Bin;
但这更属于品味问题。
主脚本末尾的<>;
通常无用。我认为你用它来阻止你的Perl窗口
立即关闭,但等待您按 ENTER 。
那没关系。
我想知道为什么perl -c script.pl
没有显示任何错误。在我的电脑上确实如此。