Perl:你如何将其转换为子程序?

时间:2011-06-01 03:50:18

标签: perl

子程序的目的是检查传入的其他标量中是否包含单词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的新手。如果您需要更多信息,请告诉我。

非常感谢。

3 个答案:

答案 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