如何在 Windows 和 Linux 上使用 perl dbmopen
我有一个 perl 脚本,它在 Linux 上运行良好,但在 Windows 上运行失败:
$freq{total} = 0;
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile";
$dictfile
指向相应平台上的正确位置。更改 0666
文件权限没有帮助。要打开的文件是一个以 gb18030
编码的文本文件。
有什么窍门吗?我需要声明编码才能在 Window 上打开它吗?或者可能是 Windows 上的不同 perl 发行版。我正在使用草莓 Perl。
谢谢。
I have a perl script that runs fine on Linux but fails on Windows at this point:
$freq{total} = 0;
dbmopen(%freq,$dictfile,0666) || die "Error: Cannot open dbmfile $dictfile";
$dictfile
points to the proper location on the respective platforms. Changing the 0666
file permissions does not help. The file to open is a text file encoded in gb18030
.
Is there a trick? Do I need to declare the encoding to open it on Window? Or possibly a different perl distro on Windows. I'm using Strawberry Perl.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
编辑:抱歉,如果我说的是显而易见的事情,但我只是重新阅读了这个问题。当你说
您的意思是纯文本文件吗?
如果是这样,我认为那就是你的问题。
dbmopen
用于索引数据库文件,最好由dbmopen
在之前运行的 perl 程序中创建。对于纯文本文件,您无法将它们绑定到哈希值。我之前的反应...
它适用于我在 Windows 上运行的 Strawberry perl 5.12.1 在 Windows7x64 上运行。你使用的是哪个 Windows Perl?确保您的安装至少具有一个 DBM 模块。
其他一些可能有帮助的点:
$!
,它会给您打开失败的错误消息。所以希望能回答你的问题。dbmopen
将清除%freq
哈希值的内容,因此您将丢失$freq{total}
(因为您可能没有注意到它的 0) 。通常的模式是:dbmopen
,更改一些哈希值,dbmclose
编辑:
$!
是包含任何失败的“系统”的错误测试的变量“ 称呼。因此,您打开的行应该类似于:要检查标准 DBM 模块,您可以从命令提示符运行以下命令
对于我来说,这给出了:
这实际上意味着我有 DB_File、GDBM_File 和 SDBM_File。但不是 NDBM_File 或 ODBM_File。抱歉,我不知道如何找出
dbmopen
默认使用哪个模块。就我个人而言,我总是
使用
特定模块,然后使用tie
运算符而不是dbmopen。Edit: Sorry, if I'm stating the obvious, but I just re-read the question. When you say
Do you mean a plain text file?
If so I think thats your problem.
dbmopen
is for indexed database file, ideally created bydbmopen
in a previous run of you perl program. For plain text files you cannot bind them to hashes.My previous resonse...
It works for me on Windows with Strawberry perl 5.12.1 running on Windows7x64. Which windows perl are you using? Make sure your installation has at least one of the DBM modules with it.
Some other points which might help:
$!
in your die statement, it will give you the error message for the failed open. So hopefully answer your question.dbmopen
will clear the contents of the%freq
hash, so you will lose$freq{total}
(because its 0 you may not notice). Usual pattern is:dbmopen
, change some hash values,dbmclose
Edits:
$!
is the variable which contains the error test of any failed "system" call. So you open line should be something like:To check for the standard DBM modules you can run the following from the command prompt
For me that gives:
Which effectively meands I have DB_File, GDBM_File, and SDBM_File. But not NDBM_File or ODBM_File. Sorry I don't know how to find out which module
dbmopen
uses by default.Personally I always
use
a specific module and then use thetie
operator instead of dbmopen.