gpt4 book ai didi

Perl 与 Aspell 的接口(interface)

转载 作者:行者123 更新时间:2023-12-02 09:05:21 27 4
gpt4 key购买 nike

我正在尝试通过 Perl 用 Aspell 识别拼写错误的单词。我在没有管理员权限的 Linux 服务器上工作,这意味着我可以访问 Perl 和 Aspell,但不能访问,例如 Text::Aspell,它是 Aspell 的 Perl 接口(interface)。

我想做一个非常简单的任务,将单词列表传递给 Aspell 并让它返回拼写错误的单词。如果我要检查的单词是“dad word lkjlkjlkj”,我可以通过命令行使用以下命令执行此操作:

aspell list
dad word lkjlkjlkj

Aspell 最后需要 CTRL + D 来提交单词列表。然后它将返回“lkjlkjlkj”,因为它不在字典中。

为了做完全相同的事情,但通过 Perl 提交(因为我需要为数千个文档执行此操作),我尝试过:
my $list = q(dad word lkjlkjlkj):
my @arguments = ("aspell list", $list, "^D");
my $aspell_out=`@arguments`;
print "Aspell output = $aspell_out\n";

预期的输出是“Aspell output = lkjlkjlkj”,因为这是 Aspell 在您通过命令行提交这些命令时给出的输出。但是,实际输出只是“Aspell output =”。也就是说,Perl 不捕获 Aspell 的任何输出。没有错误被抛出。

我不是专业的程序员,但我认为这将是一项相当简单的任务。我已经尝试了这段代码的各种迭代,但没有任何效果。我做了一些挖掘,我担心也许因为 Aspell 是交互式的,我需要使用像 Expect 这样的东西,但我不知道如何使用它。我也不确定这实际上是解决我的问题的方法。我还认为 ^D 应该是命令末尾的 CTRL+D 的适当替代品,但我所知道的是它不会引发错误。我也尝试过\cd 。不管是什么,提交命令或捕获输出显然存在问题。

最佳答案

使用 aspell 的复杂性正如您所怀疑的那样,程序的出处在于它是一个交互式和命令行驱动程序工具。但是,有一种简单的方法可以满足您的需要。

为了使用 aspell的命令list需要通过 STDIN 传递单词,正如其手册页所说。当我找到 GNU Aspell manual有点难以上手,通过它的 STDIN 将输入传递给程序很简单,我们可以将调用重写为

echo dad word lkj | aspell list

我们得到 lkj打印回来,如到期。现在这可以用完一个程序,就像它现在一样
my $word_list = q(word lkj good asdf);

my $cmd = qq(echo $word_list | aspell list);

my @aspell_out = qx($cmd);

print for @aspell_out;

这将打印行 lkjasdf .

出于特定原因,我将命令组合成字符串(而不是数组),如下所述。 qx是反引号的运算符形式,我更喜欢它的可读性。

请注意 qx可以返回字符串中的所有输出,如果在标量上下文中(例如分配给标量),或者在列表上下文中时在列表中。在这里,我分配给一个数组,这样您就可以将每个单词作为一个元素(唉,每个单词还带有一个换行符,所以可能想做 chomp @aspell_out; )。

评论命令的列表与字符串形式

一般来说,我认为建议对命令使用列表形式是安全的。所以我们会说
my @cmd = ('ls', '-l', $dir);  # to be run as an external command

代替
my $cmd = "ls -l $dir";        # to be run as an external command

列表形式通常更容易管理命令,并且完全避免使用 shell。

但是,这种情况有点不同
  • qx运算符的行为并没有真正不同——数组被连接成一个字符串,然后运行。我们可以将数组传递给它的事实是偶然的,甚至没有记录
  • 我们需要将输入通过管道传输到 aspellSTDIN ,而 shell 很简单地为我们做这件事。我们也可以使用带有命令 LIST 形式的 shell,但是我们需要显式调用它。我们也可以去 aspellSTDIN通过外壳以外的方式,但更复杂
  • 对于列表中的命令,命令名称必须是第一个单词,因此 "aspell list"从问题是错误的,它应该失败(没有命名的命令)......除了在这种情况下它不会(如果其余的都是正确的),因为对于 qx数组被折叠成一个字符串

  • 最后, apsell在 C 库中很好地公开了它的 API,并且已用于您提到的模块。我建议以用户身份安装它(不需要特权)并使用它。

    关于Perl 与 Aspell 的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59314440/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com