将参数传递给正则表达式以匹配perl中单词中的第一个字母

时间:2014-01-22 18:29:27

标签: regex perl

所以这就是我正在做的事情。这是为了做作业,我知道我不能来这里让你们为我做功课,但我被困住了。我们必须使用perl(第一次使用它以便原谅我的愚蠢)来创建一个带有参数$ str0和$ prefix的函数$ starts_with。如果$ str0以$前缀开头。然后该函数返回true。如果没有那么它就不那么简单了。我们必须使用正则表达式,因为这是练习的重点,所以这里是我的代码

sub starts_with
{
    $str0 = $_[0];
    $prefix = $_[1];

    if($prefix =~ /^($str0)/)
    {
        print $str0."\n";
        print m/^(prefix)/."\n";
        $startsWith = "Y"
    }

    if ($startsWith eq "Y")
    {
        print $str0." starts with ".$prefix."\n";
    }
    else
    {
        print $str0." does not start with ".$prefix."\n";
    }

}

我很惭愧把它放在这里,因为我不知道我在做什么。但我正在努力学习。我不知道如何在perl中做真假,这就是为什么我有$ startsWith变量。如果你愿意,你可以解决这个问题。我需要解决的部分是行

if(str0 =~ /^($prefix)/)

我还需要找出如何引用str0中的第一个字母......我想

3 个答案:

答案 0 :(得分:3)

有几点没有给出答案:

1)函数的参数在名为@_的特殊变量中传递,这是您在说$_[0]$_[1]时所访问的内容,但可以更简洁地编写将参数列表(@_)分配给list context

中的变量
sub starts_with {
   my ($str0, $prefix) = @_;
   ...
}

2)这句话:if($prefix =~ /^($str0)/)测试你试图证明的完全相反的条件。它说前缀是以变量$str0的值开头的。如果$str0$prefix开头,您真正想要测试的是什么。

它也可能用于在模式前添加m标志m/PATTERN,这意味着匹配此模式。

3)你的函数中没有return语句,(如@ M42指出)返回最后一个表达式的结果;表达式print将返回true。您可能想要返回真或假的明确。

看看你是否可以使用它来开始。

答案 1 :(得分:1)

我会做什么:

use Modern::Perl; # or use strict; use warnings; use feature qw/say/;

sub starts_with {
    # better use @_, the default array instead of just elements of them
    # ...like $_[0]
    my ($str, $pref) = @_;

    # very short expression, the pattern matching return a boolean.
    # \Q\E is there to treat the prefix as-is (no metacharacters)
    return $str =~ /^\Q$pref\E/;
}

# using our function
if (starts_with("foobar", "f")) {
    say "TRUE";
}
else {
    say "FALSE";
}

答案 2 :(得分:0)

稍微打高尔夫球......

sub starts_with { $_[0] =~ /^\Q$_[1]/ }

不要把那个版本交给: - )