Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Windows和Linux上使用perl dbmopen_Windows_Perl_Dbm - Fatal编程技术网

如何在Windows和Linux上使用perl dbmopen

如何在Windows和Linux上使用perl dbmopen,windows,perl,dbm,Windows,Perl,Dbm,我有一个perl脚本,它在Linux上运行良好,但在Windows上失败: $freq{total} = 0; dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile"; $dictfile指向相应平台上的正确位置。更改0666文件权限没有帮助。要打开的文件是用gb18030编码的文本文件 有把戏吗?我需要声明编码才能在窗口上打开它吗?或者可能是Windows上的另一个perl发行版。我正在使用草莓P

我有一个perl脚本,它在Linux上运行良好,但在Windows上失败:

$freq{total} = 0;
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile";
$dictfile
指向相应平台上的正确位置。更改
0666
文件权限没有帮助。要打开的文件是用gb18030编码的文本文件

有把戏吗?我需要声明编码才能在窗口上打开它吗?或者可能是Windows上的另一个perl发行版。我正在使用草莓Perl


谢谢。

编辑:对不起,如果我说的是显而易见的,但我只是重新阅读了问题。当你说

要打开的文件是用gb18030编码的文本文件

你是说纯文本文件吗

如果是的话,我想那是你的问题
dbmopen
用于索引数据库文件,理想情况下由上次运行perl程序时的
dbmopen
创建。对于纯文本文件,不能将其绑定到哈希

我以前的反应

它在Windows上运行,在Windows7x64上运行草莓perl 5.12.1。您正在使用哪些windows perl?确保您的安装中至少有一个DBM模块

以下几点可能会有所帮助:

  • 您应该包括
    $在您的die语句中,它将为您提供失败打开的错误消息。所以希望能回答你的问题
  • dbmopen
    将清除
    %freq
    散列的内容,因此您将丢失
    $freq{total}
    (因为您可能没有注意到它是0)。通常的模式是:
    dbmopen
    ,更改一些散列值,
    dbmclose
编辑:

$
是包含任何失败的“系统”调用的错误测试的变量。所以你打开的线应该是这样的:

dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile: $!";
要检查标准DBM模块,可以从命令提示符运行以下命令

for %m in ( DB_File GDBM_File SDBM_File NDBM_File ODBM_File ) do @perl -M%m -e "print qq(%m: $%m::VERSION\n)"
对我来说,这给了:

DB_File: 1.82
GDBM_File: 1.10
SDBM_File: 1.06
Can't locate NDBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.
Can't locate ODBM_File.pm in @INC (@INC contains: C:/Nerd/StrawberryPerl/perl/site/lib C:/Nerd/StrawberryPerl/perl/vendor/lib C:/Nerd/StrawberryPerl/perl/lib .)
.
BEGIN failed--compilation aborted.
这实际上意味着我有DB_文件、GDBM_文件和SDBM_文件。但不是NDBM_文件或ODBM_文件。对不起,我不知道如何确定默认情况下使用哪个模块
dbmopen


就我个人而言,我总是
使用
一个特定的模块,然后使用
tie
操作符而不是dbmopen。

看起来你缺少一个合适的dbm库/dll。简短回答:不要使用
dbmopen
。谢谢。我正在WinXP SP3 32位和Wine 1.3.19上使用草莓perl 5.10.1。如何检查是否安装了DBM模块?在安装过程中,我没有看到任何选择。另外,我不是perl程序员。如何添加$!为了死亡声明?再次感谢。我试图用最少的重写来修补这个perl脚本(我的perl技能是nill)。该命令显示DB_文件:1.82、GDBM_文件:1.090001和SDBM_文件:1.06可用。添加美元!引号中的变量未向错误消息添加任何内容。我想我将卸载5.10并安装5.12。@tahoar在文件不存在时尝试运行该程序。如果有效,那么您的文件就有问题。请参阅我在回答相同问题5.10和5.12 StrawberryPerl和ActivePerl顶部的注释。脚本测试db文件是否存在并使用
dbmopen
。如果不存在,
dbmopen
打开一个原始文本文件,对其进行散列,保存一个db文件并使用它。这在Linux上工作,但在Windows上失败。奇怪的是,在Windows上使用Linux创建的db文件也无法使用
dbmopen
打开。我有两个不同的脚本使用这种方法加载字典。两者都在Windows上失败。我必须在Windows平台上找到这些的替代品。再次感谢您的故障排除帮助,但这仍然是一个未解决的不兼容性问题。