我正在检查这个搬运工。下面他们说我应该改变我的第一行。到底是什么我尝试了所有的东西,但干扰器不起作用。这可能是一个很好的例子吗?
#!/usr/local/bin/perl -w
#
# Perl implementation of the porter stemming algorithm
# described in the paper: "An algorithm for suffix stripping, M F Porter"
# http://www.muscat.com/~martin/stem.html
#
# Daniel van Balen (vdaniel@ldc.usb.ve)
#
# October-1999
#
# To Use:
#
# Put the line "use porter;" in your code. This will import the subroutine
# porter into your current name space (by default this is Main:: ). Make
# sure this file, "porter.pm" is in your @INC path (it includes the current
# directory).
# Afterwards use by calling "porter(<word>)" where <word> is the word to strip.
# The stripped word will be the returned value.
#
# REMEMBER TO CHANGE THE FIRST LINE TO POINT TO THE PATH TO YOUR PERL
# BINARY
#
作为一个代码我写的是:
use Lingua::StopWords qw(getStopWords);
use Main::porter;
my $stopwords = getStopWords('en');
@stopwords = grep { $stopwords->{$_} } (keys %$stopwords);
chdir("c:/perl/input");
@files = <*>;
foreach $file (@files)
{
open (input, $file);
while (<input>)
{
open (output,">>c:/perl/normalized/".$file);
chomp;
porter<$_>;
for my $stop (@stopwords)
{
s/\b\Q$stop\E\b//ig;
}
$_ =~s/<[^>]*>//g;
$_ =~ s/[[:punct:]]//g;
print output "$_\n";
}
}
close (input);
close (output);
代码没有错误,除非它不会产生任何错误!
答案 0 :(得分:4)
该评论块充满了错误的建议。
<#> A#! .pm文件中的行无效。这是一个常见的错误。 #! line告诉Unix哪个解释器用运行程序当且仅当将文件作为命令行程序运行时。./somefile # uses #! to determine what to run somefile with
/usr/bin/perl somefile # runs somefile with /usr/bin/perl regardless of #!
#! line在use
的模块,.pm文件中不执行任何操作。 Perl已经在那个时候运行了。这条线只不过是一条评论。
第二个问题是您的默认命名空间是main
而不是Main
。套管很重要。
转到您的代码,use Main::porter;
不应该有用。它应该是use porter
。您应该收到Can't locate Main/porter.pm in @INC (@INC contains: ...)
之类的错误消息。如果该代码运行,也许您将porter.pm移动到Main/
目录中?将其移出,会混淆搬运工功能的导入。
porter<$_>;
说“尝试从文件句柄中读取一行$ _并将其传递给搬运工”。 $ _不是文件句柄,它是您刚刚打开的文件中的一行。您希望porter($_)
将该行传递给移植器功能。如果您打开警告(将use warnings
添加到脚本顶部),Perl会警告您这类错误。
你也可能想要用搬运工的返回值做一些事情,否则它真的什么都不做。 my @whatever_porter_returns = porter($_)
。
可能您的chdir
或open
中的一个或多个已经无声地失败,因此您的程序可能没有任何输入。不幸的是,Perl不会让你知道发生这种情况时,你必须检查。通常你add an or die $!
after the function来检查错误。这是繁忙的工作,通常会忘记,而use autodie
如果chdir
或open
等系统调用失败,则会自动产生错误。
通过修复这些内容,您的代码应该可以正常工作,或至少产生有用的错误消息。
最后,有许多stemming modules on CPAN的质量可能高于您在文档,测试和更新中找到的质量等等。 Lingua::Stem和Text::English专门使用移植器算法。你可能想给那些人一个机会。