2

所以,我有一个像这样读取的文件

Some.Text~~~Some big text with spaces and numbers and something~~~Some.Text2~~~Again some big test, etc~~~Text~~~Big text~~~And so on

我想要的是,如果 $x 与 Some.Text 匹配,例如,我怎样才能得到一个带有“一些带有空格和数字的大文本”的变量,或者如果它与“Some.Text2”匹配以获得“再次进行一些大测试, ETC”。

open FILE, "<cats.txt" or die $!;
while (<FILE>) {
chomp;
my @values = split('~~~', $_);
  foreach my $val (@values) {
    print "$val\n" if ($val eq $x)
  }

  exit 0;
}
close FILE;

从现在开始,我不知道该怎么办了。如果它与我的变量匹配,我只是设法打印“Some.text”。

4

2 回答 2

2

splice可用于@values成对删除元素:

while(my ($matcher, $printer) = splice(@values, 0, 2)) {
    print $printer if $matcher eq $x;
}

或者,如果您需要@values保持原样,您可以使用 ac 样式循环:

for (my $i=0; $i<@values; $i+=2) {
    print $values[$i+1] if $values[$i] eq $x;
}
于 2013-10-25T09:02:03.527 回答
1

您最好的选择可能不是拆分,而是使用正则表达式,如下所示:

use strict;
use warnings;
use feature 'say';

while (<DATA>) {
    while (/Some.Text2?~~~(.+?)~~~/g) {
        say $1;
    }
}

__DATA__
Some.Text~~~Some big text with spaces and numbers and something~~~Some.Text2~~~Again some big test, etc~~~Text~~~Big text~~~And so on

输出:

Some big text with spaces and numbers and something
Again some big test, etc
于 2013-10-25T09:58:48.880 回答