2016-09-20 26 views
1

我想这是一个非常简单的问题,但经过20分钟的搜索后,我找不到任何解决我的问题。在Perl中,是否有一个运算符来粗略地检查另一个字符串的字符串?

所以我想检查一个字符串变量,不管它是否有'OK'

我尝试使用~~~~给我一个错误,~~是说不正确的操作符是猜测。我认为~就像“粗略”,但似乎并非如此。这里是我的代码:

open (INPUT, "<", $curfile); 
while (<INPUT>) { 
$firsttenchars= substr ($_, 0, 10); 
if ($firsttenchars ~ "OK") 
    { 
    print "success"; 
    }    
} 
close INPUT; 
+2

当我阅读标题时,我想你想要一个模糊匹配,即'ofobra'而不是'foobar'。也许这就是为什么你很难找到你想要的东西,特别是如果英语不是你的母语。有时很难准确地描述问题。 – simbabque

+0

是的,那是如此的真实,甚至花了我几分钟的时间来写这个标题,尽管我不会用我的母语问别人。 –

回答

8

您正在寻找模式匹配。

if ($firsttenchars =~ m/OK/) { ... } 

如果文字字符串'OK'(区分大小写)被发现某处的$firsttenchars内这将返回true。它不在乎多久,一旦发现它,它就停止寻找。

//内部的东西是一个正则表达式,简称正则表达式。这些用于创建模式=~是将标量值($firsttenchars)绑定到模式匹配的binding operatorm//m是匹配运算符。还有一个s///,用于替换某种模式。

您可以阅读perlrequickperlreperlretut了解更多信息。 regex tag wiki here on Stack Overflow是开始使用正则表达式的极好资源。


~运算符是按位否定运算符。

一元“〜”执行按位否定,即1的补码。例如,0666 &〜027为0640.(请参见整数算术和位运算符)注意,结果的宽度取决于平台:在32位平台上〜0是32位宽,但是64位宽在64位平台上,所以如果您期望某个位宽,请记住使用“&”运算符来屏蔽掉多余的位。

~~运营商被称为smart match。它在Perl中已经有一段时间了,它应该做一些聪明的事情。它的行为基于你在RHS(右侧)和LHS(左侧)上得到的结果。它仍然被认为是实验性的,Perl社区中的很多人都觉得这是有争议的。你用它与两个标量,它们都包含字符串。这变成了一个eq,它检查字符串相等。

任何任何字符串平等
这样的:任何EQ任何

在Perl所有运营商的完整概述可以在perlop找到。请注意,这个链接指向最新版本(撰写本文时为5.24)。你的Perl可能比较老,可能没有全部。


如果'OK'含有该字符串的内部检查的更快的方法是the index built-in。它返回另一个字符串中第一次出现的字符串。因为如果它没有找到该字符串,它将返回-1,因此需要显式检查返回值。

if (index($firsttenchars, 'OK') != - 1) { ... } 

这比模式匹配写得多一点,但速度要快很多。

+1

作品,谢谢。我真的不知道我是否应该喜欢这个简单或讨厌的事实,因为我无法弄清楚。 –

+1

@ZesaRex正则表达式是一个复杂的主题,但它非常强大,并且在Perl中非常简单。如果你对Perl相当陌生,我建议你自己找一本_Learning Perl_书,它有两个关于正则表达式的章节,大约需要三到五个晚上才能完成。如果你已经知道一些编程,Ovid的_Beginning Perl_也是一个很好的资源。不要因为不知道这件事而伤害自己。如果你从未听说过这样的事情存在,那么你不知道这不是你的错。 :) – simbabque

+5

@ZesaRex你不能“_figure out_”这样的事情。需要仔细阅读:) – zdim

相关问题