2

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

$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' '?/));

但是,如果我 print ,两者都没有给出任何东西$local_file。这里可能有什么问题?谢谢你。

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

  1. http://perlmeme.org/howtos/perlfunc/substr.html参见示例 1c
  2. 如何获取给定字符串的子字符串,直到第一次出现指定字符?
4

2 回答 2

4

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

正则表达式通过绑定运算符 应用于字符串=~

要提取正则表达式的匹配区域,请将模式括在括号中(捕获组)。匹配的子字符串将在以下位置可用$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.

于 2013-05-02T11:31:37.147 回答
3

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

正则表达式是 Perl 的一个强大功能,也是最适合此任务的工具:

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

有关运算符的更多信息,请参见perlop=~

于 2013-05-02T15:37:04.967 回答