子程序的目的是检查传入的其他标量中是否包含单词pasttense,然后执行替换并返回该单词。
原始工作代码:
if ($sentences[$i] =~ /\b$pasttense/i and $firstword[1] =~ /\b$pasttense/i) {
$subsentences[$i] =~ s/$pasttense/ **$pasttense** /ig;
}
elsif ($sentences[$i] =~ /\b$pastpart/i and $firstword[1] =~ /\b$pastpart/i) {
$subsentences[$i] =~ s/$pastpart/ **$pastpart** /ig;
}
elsif ($sentences[$i] =~ /\b$thirdsing/i and $firstword[1] =~ /\b$thirdsing/i) {
$subsentences[$i] =~ s/$thirdsing/ **$thirdsing** /ig;
}
elsif ($sentences[$i] =~ /\b$presentpart/i and $firstword[1] =~ /\b$presentpart/i) {
$subsentences[$i] =~ s/$presentpart/ **$presentpart** /ig;
}
elsif ($sentences[$i] =~ /\b$search_key$pluralsuffix/i and $firstword[1] =~ /$search_key$pluralsuffix\b/i) {
$subsentences[$i] =~ s/$search_key$pluralsuffix/ **$search_key$pluralsuffix** /ig;
}
elsif ($sentences[$i] =~ /\b$search_key/i and $firstword[1] =~ /\b$search_key\b/i) {
$subsentences[$i] =~ s/\b$search_key/ **$search_key**/gi;
}
MY ATTEMPT:
sub suffix_changer_and_highlighter {
my ($presentword, $check1, $check2) = @_; ##search_key##parsewords[1] or firstword[1]##sentences
my $pluralsuffix = 's'; ##unless ends in y
require 'verbTenseChanger.pl';
my $pasttense = changeVerbForm($presentword,0,1);
my $pastpart = changeVerbForm($presentword,0,2);
my $thirdsing = changeVerbForm($presentword,0,3);
my $presentpart = changeVerbForm($presentword,0,4);
if ($check2 =~ /\b$pasttense/i and $check1 =~ /\b$pasttense/i) {
return s/$pasttense/ **$pasttense** /ig;
}
elsif ($check2 =~ /\b$pastpart/i and $check1 =~ /\b$pastpart/i) {
return s/$pastpart/ **$pastpart** /ig;
}
elsif ($check2 =~ /\b$thirdsing/i and $check1 =~ /\b$thirdsing/i) {
return s/$thirdsing/ **$thirdsing** /ig;
}
elsif ($check2 =~ /\b$presentpart/i and $check1 =~ /\b$presentpart/i) {
return s/$presentpart/ **$presentpart** /ig;
}
elsif ($check2 =~ /\b$presentword$pluralsuffix/i and $check1 =~ /$presentword$pluralsuffix\b/i) {
return s/$presentword$pluralsuffix/ **$presentword$pluralsuffix** /ig;
}
elsif ($check2 =~ /\b$presentword/i and $check1 =~ /\b$presentword\b/i) {
return s/\b$presentword/ **$presentword**/gi;
}
}
它被称为:
$subsentences[$i] =~ suffix_changer_and_highlighter($search_key, $firstword[1], $sentences[$i]);
我收到一条错误消息,指出s ///未初始化。对不起,如果这是基本的,但我是Perl的新手。如果您需要更多信息,请告诉我。
非常感谢。
答案 0 :(得分:2)
您的s///
表达式不会对任何内容采取任何行动。你需要这样做:
$check2 =~ s/\b$search_key/ **$search_key**/gi;
return $check2;
或任何有意义的事情。在上面的代码中,$check2
变量将根据switch语句进行更改。 switch语句返回的值是我怀疑你想要返回的更改数量。
这有帮助吗?
答案 1 :(得分:1)
你的子程序没有返回任何东西(好吧......任何有用的东西)。您需要添加return并返回可在s///
命令中使用的某种值。
顺便说一下,除非你想使用eval,否则你不能简单地为你在这里做的任何命令返回文本字符串:
$subsentences[$i] =~ suffix_changer_and_highlighter($search_key,
$firstword[1],
$sentences[$i]);
我假设=~
你试图做某种替代。对?在这种情况下,您需要将$subsentence[$i]
传递到子例程中,然后在那里进行替换。然后你只需返回值:
$subsentences[$i] = suffix_changer_and_highlighter($search_key,
$firstword[1],
$sentences[$i]);
否则,您需要使用qr
函数返回引用的正则表达式列表,可能是这样的:
my ($from, $to) = suffix_changer_and_highlighter($search_key,
$firstword[1],
$sentences[$i]);
$subsentences[$i] =~ s/$from/$to/;
答案 2 :(得分:1)
看起来您的所有测试和替换都遵循相同的模式。所以我将if / elsif / logic链转换为数据,并处理一系列可能的测试。
use strict;
use warnings;
use My::VerbTenseChanger qw( changeVerbForm );
sub suffix_changer_and_highlighter {
my ($presentword, $check1, $check2) = @_; ##search_key##parsewords[1] or firstword[1]
##sentences
my $pluralsuffix = 's'; ##unless ends in y
my @verbforms = map changeVerbForm( $presentword, 0, $_ ), 1..4;
for my $form ( @verbforms ) {
if( $check1 =~ /\b$form/i and $check2 =~ /\b$form/i ) {
$check2 =~ s/\b$form/ **$form**/ig;
return $check2;
}
}
return;
}
另外,不要使用require在主脚本中执行perl库。自从Perl 4以来,这已经不是标准做法 - 也就是90年代初期。在屁股上踢你的教程。它们已经过时了。
而是创建一个模块并导出您的函数,以便可以导入它们。
package My::VerbTenseChanger; # Declare a new namespace.
use strict;
use warnings;
use Exporter qw( import ); # Import the import function from exporter.
our @EXPORT_OK = qw( changeVerbForm ); # List the functions that can be exported.
sub changeVerbForm {
# Here's your normal code you had before.
}
1; # Make sure you end the file with a TRUE value like 1.
use
相对于模块搜索路径中的任何位置(My/VerbTenseChanger.pm
),上述包将位于文件@INC
中。保存项目内容的最简单方法是与主程序在同一目录中。
MyGrammarianProject
|- verby_magic <------------- This is your script.
\- My <---------------------- This is a subdirectory
\- VerbTenseChanger.pm <- This is the module file
哇,最后,你可能想看看各种Lingua modules on CPAN。