在Perl中,如何从两个字符之间的XML中获取文本

在Perl中,如何从两个字符之间的XML中获取文本,xml,perl,Xml,Perl,我有一个大文件,我想分析和抓取选择的文本片段。以下是文件中的实际示例: en-US AcceptedText pt="dial:def"Tag u="contact"Mom/Tag/AcceptedText 11373 我想获取的文本片段介于第一个和之间:。在上面的例子中,它将是单词dial 以下是我编写的脚本: #!/usr/bin/perl open (SESAME, '/home/my_name/whereMyFileLives.txt'); while (<SESAME&g

我有一个大文件,我想分析和抓取选择的文本片段。以下是文件中的实际示例:

en-US   AcceptedText pt="dial:def"Tag u="contact"Mom/Tag/AcceptedText 11373
我想获取的文本片段介于第一个和之间:。在上面的例子中,它将是单词dial

以下是我编写的脚本:

#!/usr/bin/perl

open (SESAME, '/home/my_name/whereMyFileLives.txt');
while (<SESAME>) {
  $text .= $_;
}
close (SESAME);

$text =~ /\n*$/;
$text =~ m/ \" (.*) :> /;

print $text;
当我运行这个脚本时,它会将文件打印到终端,与文件原来的样子一模一样。它不会解析文本并提取我希望它提取的文本片段


有任何指针吗?

无法理解您为什么要与\n进行第一次匹配,但对于您的任务,您可以这样做:

my ($result) = $text =~ /\"([^:]*):/;
尝试:


我仍在学习perl,所以我可能错了,但第一次与\n匹配是为了尝试清除文件中任何松散的新行。我尝试替换行$text=~m/\.*:>/;使用您在$text=~/\[^:]*:/上面提供的行;但是,当脚本到达print$text行时,终端的输出仍然是原样的文件,而不是我要提取的文本片段。。对不起,如果我把事情搞砸了!!我应该将结果放在一个单独的变量中吗?鼓励使用正则表达式来处理XML是个坏主意。它充满了问题,Perl有几个很好的XML库。@user1849737:Rohit给您的答案不是更改$text,它只是提取您想要的字符串部分并将其放入$result。因为您的输入是XML数据,所以它不能像您显示的示例那样,因为它不是有效的XML。而且您不应该使用正则表达式处理XML:如果您使用专门用于此任务的库,那么会更简单、更安全。如果你发布更多的实际数据,在上下文中显示,那么你会得到更好的答案。
my ($string) = $text =~ /"(.*?):/;
#!/usr/bin/env perl

use strict;
use warnings;

# --------------------------------------

use charnames qw( :full :short );
use English qw( -no_match_vars ) ;  # Avoids regex performance penalty

# open (SESAME, '/home/my_name/whereMyFileLives.txt');
#
# Please use the three-argument open
my $sesame_file = '/home/my_name/whereMyFileLives.txt';
open my $sesame_fh, '<', $sesame_file or die "could not open $sesame_file: $OS_ERROR\n";

# while(<SESAME>)
while( my $line = <$sesame_fh> ){

# {
# $text .= $_;
# }
# close (SESAME);
# $text=~/\n*$/;
# $text=~m/ \" (.*) :> /;
# print $text;
#
# No need to store the complete text, just extract what you want from each line
    if( $line =~ m{ \" ( [^:]* ) \: }msx ){
        my $snippet = $1;
        print "$snippet\n";
    } # end if

} # end while
close $sesame_fh or die "could not close $sesame_file: $OS_ERROR\n";