3

whitespaces在将字符串与正则表达式匹配后,我试图替换它。

my $string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";

if ($string =~ m!(Season\s\d+\sEpisode\s\d+)!){

    $1 =~ s!\s+!!g;

    say $1;

}

现在,当我运行上面的代码时,我得到Modification of a read-only value attempted. 现在,如果我将 的值存储$1在一个变量中,而不是尝试对该变量执行替换,它就可以正常工作。

那么,有什么方法可以在不创建新临时变量的情况下就地执行替换。

PS:有人可以告诉我如何将上述代码编写为单行代码,因为我无法:)

4

5 回答 5

6

不要乱用特殊变量,只需捕获您想要的数据,同时自己构建输出。

$string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";
if ($string =~ m!Season\s(\d+)\sEpisode\s(\d+)!){
   say("Season$1Episode$2");
}
于 2012-09-10T12:36:00.843 回答
4

看起来您想压缩Season 1 Episode 1Season1Episode1原始字符串中

这可以方便地使用@-and与作为左值@+的调用一起完成substr

这个程序显示了这个想法

use strict;
use warnings;

my $string = "watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid";

if ($string =~ /Season\s+\d+\s+Episode\s+\d+/ ) {

  substr($string, $-[0], $+[0] - $-[0]) =~ s/\s+//g;
  print $string;
}

输出

watch download Buffy the Vampire Slayer Season1Episode1 Gorillavid

你没有说为什么你想在一行中写这个,但如果你必须那么这将为你做

perl -pe '/Season\s*\d+\s*Episode\s*\d+/ and substr($_, $-[0], $+[0] - $-[0]) =~ s/\s+//g' myfile
于 2012-09-10T12:39:21.370 回答
2

如果您使用后脚本for循环来创建 的本地实例$_,则可以将替换与打印链接(使用逗号)以实现匹配的预打印处理。

/g请注意,使用 global选项时不需要括号。另请注意,这会使您的 if 语句变得多余,因为任何不匹配都会向您的for循环返回一个空列表。

perl -nlwe 's/\s+//g, print for /Season\s+\d+\s+Episode\s+\d+/g;' yourfile.txt

在您的脚本中,它看起来像这样。请注意,if 语句已替换为 for 循环。

for ( $string =~ /Season\s+\d+\s+Episode\s+\d+/g ) {
    s/\s+//g;  # implies $_ =~ s/\s+//g
    say;       # implies say $_

}

This is mainly to demonstrate the one-liner. You may insert a lexical variable instead of using $_, e.g. for my $match ( ... ) if you want increased readability.

于 2012-09-10T16:51:41.710 回答
1
$string =~ s{(?<=Season)\s*(\d+)\s*(Episode)\s*(\d+)}{$1$3$2};
于 2012-09-10T12:54:48.330 回答
-1

你可以试试这个:

perl -pi -e 'if($_=~/Season\s\d+\sEpisode\s\d/){s/\s+//g;}' file

测试如下:

XXX> cat temp
watch download Buffy the Vampire Slayer Season 1 Episode 1 Gorillavid
XXX> perl -pi -e 'if($_=~/Season\s\d+\sEpisode\s\d/){s/\s+//g;}' temp
XXX> cat temp
watchdownloadBuffytheVampireSlayerSeason1Episode1GorillavidXXX>
于 2012-09-10T12:39:02.383 回答