这个琐碎的功能傻了吗?

时间:2010-06-07 16:25:00

标签: perl

我今天遇到了一个让我停下来思考的功能。我想不出有这么好的理由:

sub replace_string {
        my $string  = shift;
        my $regex   = shift;
        my $replace = shift;

        $string =~ s/$regex/$replace/gi;

        return $string;
}

我能看到的唯一可能的值是它让你能够控制替换使用的默认选项,但我认为没有用。看到这个函数后,我的第一反应就是“这是做什么的?”。一旦我了解它的作用,我就会假设从那时起就做到了。这意味着如果它发生变化,它将破坏我需要它的任何代码。这意味着该功能可能永远不会改变,或者更改它会破坏大量代码。

现在我想追踪原来的程序员,并在他或她身上打败一些感觉。这是一个有效的愿望,还是我错过了这个功能带来的价值?

5 个答案:

答案 0 :(得分:11)

该功能的问题包括:

  • 不透明replace_string并未告诉您在不进行转义的情况下执行不区分大小写的全局替换。
  • 非惯用$string =~ s{$this}{$that}gi是您可以了解它的含义,而不是它的一些奇怪的角落功能。 replace_string每个人都必须了解每个人的详细信息,并且每个人都会有不同的信息。
  • 不灵活:想要进行非全局搜索和替换?抱歉。您可以通过传入qr//来输入一些修饰符,但这比其隐藏的s///知识要高得多。
  • 不安全:用户可能认为该函数采用字符串,而不是正则表达式。如果他们放入未经检查的用户输入,他们就会打开一个潜在的安全漏洞。
  • 较慢:只是添加最后的侮辱。

优点是:

  • 识字:函数名称解释了它的作用,而无需检查正则表达式的详细信息(但它给出了不完整的解释)。
  • 默认值gi默认值始终存在(但名称中不明显)。
  • 更简单的语法:不必担心分隔符(不是s{}{}很难)。
  • 保护免受全球副作用:正则表达式匹配设置全局变量的沙拉($1$+等...)但它们会自动在本地范围内功能。如果你将它们用于另一个正则表达式,它们不会干涉。

封装有点过于热心。

答案 1 :(得分:5)

print replace_string("some/path", "/", ":");

是的,你可以在不必替换/使用不同的分隔符或在正则表达式中转义/得到一些魔力。

答案 2 :(得分:5)

如果它只是s///的详细替代品,那么我猜它是由某人从一种使用正则表达式需要额外语法的语言来到Perl的人编写的,而且这种方式更适合编码。如果是这样的话,我会将它归类为Perl baby-talk:对经验丰富的程序员来说傻乎乎的尴尬但不坏 - 不过还不足以保证殴打,无论如何。 ;)

如果我真的很眯眼,我几乎可以看到这样一个函数可能有用的情况:将一堆模式应用于一堆字符串,允许用户输入术语,为回调提供CODE参考...... / p>

答案 3 :(得分:4)

我看到这是一个新的Perl程序员的第一反应是不想记住正则表达式的语法并创建一个他或她可以轻松记住的函数,而不需要学习语法。

答案 4 :(得分:1)

我能看到的除了已经提到的那些之外的唯一原因(新程序员不想记住正则表达式语法)是他们可能正在使用一些没有任何语法突出显示正则表达式的IDE,但它确实存在他们写的功能。不是最好的理由,但似乎有道理。