在Perl中删除子字符串?

时间:2013-05-02 11:25:13

标签: regex perl

我在变量中有一个字符串:

$mystr = "some text %PARTS/dir1/dir2/myfile.abc some more text";

现在%PARTS字面上存在于字符串中,它不是变量或散列。 我想从中提取子字符串%PARTS/dir1/dir2/myfile.abc。我创建了以下reg表达式。我只是Perl的初学者。如果我做错了什么,请告诉我。

my $local_file = substr ($mystr, index($mystr, '%PARTS'), index($mystr, /.*%PARTS ?/));

我甚至试过这个:

my $local_file = substr ($mystr, index($mystr, '%PARTS'), index($mystr, /.*%PARTS' '?/));

但如果我打印$local_file,两者都什么都不给。 这可能有什么问题? 谢谢。

更新:引用以下网站使用此方法:

  1. http://perlmeme.org/howtos/perlfunc/substr.html参见示例1c
  2. How to take substring of a given string until the first appearance of specified character?

2 个答案:

答案 0 :(得分:4)

index函数返回字符串中子字符串出现的第一个索引,否则为-1。它与正则表达式无关。

使用绑定运算符 =~将正则表达式应用于字符串。

要提取正则表达式的匹配区域,请将模式包含在parens(捕获组)中。匹配的子字符串将在$1中提供:

my $str = "some text %PARTS/dir1/dir2/myfile.abc some more text";
if ($str =~ /(%PARTS\S+)/) {
  my $local_file = $1;
  ...; # do something
} else {
  die "the match failed"; # do something else
}

\S字符类将匹配每个非空格字符。

要了解正则表达式,您可以查看perlretut

答案 1 :(得分:3)

index函数与regexx无关。它的参数只是字符串,而不是正则表达式。所以你的使用是错误的。

Regexps是Perl的强大功能,也是此任务最合适的工具:

my ($local_file) = $mystr =~ /(%PARTS[^ ]+)/;

有关=~运算符的详细信息,请参阅perlop