在Perl中,是否有一个运算符来粗略地检查另一个字符串的字符串?
我想这是一个非常简单的问题,但经过20分钟的搜索后,我找不到任何解决我的问题。在Perl中,是否有一个运算符来粗略地检查另一个字符串的字符串?
所以我想检查一个字符串变量,不管它是否有'OK'
。
我尝试使用~
和~~
。 ~
给我一个错误,~~
是说不正确的操作符是猜测。我认为~
就像“粗略”,但似乎并非如此。这里是我的代码:
open (INPUT, "<", $curfile);
while (<INPUT>) {
$firsttenchars= substr ($_, 0, 10);
if ($firsttenchars ~ "OK")
{
print "success";
}
}
close INPUT;
您正在寻找模式匹配。
if ($firsttenchars =~ m/OK/) { ... }
如果文字字符串'OK'
(区分大小写)被发现某处的$firsttenchars
内这将返回true。它不在乎多久,一旦发现它,它就停止寻找。
//
内部的东西是一个正则表达式,简称正则表达式。这些用于创建模式。 =~
是将标量值($firsttenchars
)绑定到模式匹配的binding operator。 m//
的m
是匹配运算符。还有一个s///
,用于替换某种模式。
您可以阅读perlrequick,perlre和perlretut了解更多信息。 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) { ... }
这比模式匹配写得多一点,但速度要快很多。
作品,谢谢。我真的不知道我是否应该喜欢这个简单或讨厌的事实,因为我无法弄清楚。 –
@ZesaRex正则表达式是一个复杂的主题,但它非常强大,并且在Perl中非常简单。如果你对Perl相当陌生,我建议你自己找一本_Learning Perl_书,它有两个关于正则表达式的章节,大约需要三到五个晚上才能完成。如果你已经知道一些编程,Ovid的_Beginning Perl_也是一个很好的资源。不要因为不知道这件事而伤害自己。如果你从未听说过这样的事情存在,那么你不知道这不是你的错。 :) – simbabque
@ZesaRex你不能“_figure out_”这样的事情。需要仔细阅读:) – zdim
当我阅读标题时,我想你想要一个模糊匹配,即'ofobra'而不是'foobar'。也许这就是为什么你很难找到你想要的东西,特别是如果英语不是你的母语。有时很难准确地描述问题。 – simbabque
是的,那是如此的真实,甚至花了我几分钟的时间来写这个标题,尽管我不会用我的母语问别人。 –