【问题标题】:Perl string matchingPerl 字符串匹配
【发布时间】:2012-12-30 10:22:59
【问题描述】:

我在使用index=~ 运算符进行Perl 字符串匹配/搜索时遇到问题。我需要在文本文件中搜索字符串“RT @zaynmalik: Big cover for @cosmopolitanuk ! Boys looking slick http://example.com/FcWA80HI”。

if($splitlines[1] =~ /RT @zaynmalik: Big cover for @cosmopolitanuk ! Boys looking slick http://example.com/FcWA80HI/){
     ## Do something ##
}

但是,因为 '@' 在 Perl 中是一个特殊字符,所以我遇到了编译错误。你能给我一个方法来做到这一点吗?我尝试将字符串保存到像$str 这样的变量中,但它不起作用(这是可以理解的)。

所以,这就是我现在正在做的,

$max_freq_tweet = 'RT @zaynmalik: Big cover for @cosmopolitanuk ! Boys looking slick http://example.com/FcWA80HI';
if($splitlines[1] =~ /\Q$max_freq_tweet\E/){
    print FILE5 "$splitlines2[1] \n";
}

但它似乎仍然无法正常工作。

【问题讨论】:

  • I am getting compile errors -- 什么错误?你试过什么?如果您要在没有实际显示任何代码或错误消息的情况下提出问题,那么只有当有人真正猜到您做错了什么时,您才会幸运。
  • @loldop Can't locate telepathy.pm in @INC.
  • @TLP 仅在 Perl6 中:(

标签: string perl substring


【解决方案1】:

要么通过反斜杠转义@,要么使用单引号。

my $search_string = 'RT @zaynmalik: Big cover for @cosmopolitanuk ! Boys looking slick http://example.com/FcWA80HI';
# or:               "RT \@zaynmalik: Big cover for \@cosmopolitanuk ! Boys looking slick http://example.com/FcWA80HI"

if (-1 != index $str, $search_string) { do something }

如果您有一个字符串并想在正则表达式中使用它,您应该确保通过\Q...\E 保护其含义:

if ($str =~ /\Q$search_string\E/) { do something }

\QUOT\E 不会阻止数组插值,但该字符串中的任何字符都不会被视为特殊;没有它,字符串中的. 将匹配任何字符!

【讨论】:

  • without it ... 任何特殊字符都会做它自己的工作:)
  • @amon,你能检查一下编辑过的问题,让我知道代码有什么问题吗?
【解决方案2】:

您需要在您的正则表达式中转义 @。如$str =~ /RT \@.*:/

编辑:您还可以使用反斜杠 (\) 转义斜杠 (/)。 $str =~/RT \@.*: .* http:\/\/.*/.

【讨论】:

  • 好的,斜线呢?
【解决方案3】:

您需要使用前面的\(反斜杠)转义特殊字符。

这不仅适用于@,也适用于其他字符。

为了安全起见,您可以转义任何非字母字符。

【讨论】:

  • 是的,我尝试这样做,但我无法逃脱斜线。实际上,我是从一个文件中提取该字符串,将其存储在一个变量中,然后在另一个充满推文的文件中搜索该变量。所以,即使我反驳这种方法,也不能完全解决问题。
  • @Jones 如果您要查找整个特定行,使用eq 可能更容易。或者索引,就像 amon 建议的那样。
  • 不,我正在检查是否存在子字符串。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 2014-08-18
  • 2012-11-24
  • 2018-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多