2012-04-24 13 views
-2

好吧,我有一个让我疯狂的问题。我试图抽取子与使用正则表达式:在perl中用正则表达式提取一个子字符串

($var) = $data =~ m/regex/; 

它的工作,但“串”所返回的是不太一样的真正的SUBSTR。打印字符串看起来像真正的substr,但用if($ var eq“substr”)检查不会返回true。我也注意到,当我尝试使用$ var。=“..”添加某些内容时,我得到(如果$ var是“hello”)“..llo”。

这是什么回来?

我在Linux中运行这个如果有所作为。我不认为会这样,但是这个相同的代码适用于Windows。

下面的代码示例:

$datatxt contains 
.. 
udir=/home/me/ 
.. 

use File::Read; 
my $data = read_file({skip_comments => 1}, $datatxt); 

($udir) = $data =~ m/udir=(.*)/; 
print $udir; #prints /home/me/ 
print ".".$udir."."; #prints ..home/me/ 
if ($udir ne "/home/me/") { 
    print "not equal"; #prints... 
} 
+0

你的正则表达式中是否有任何组? – Cameron 2012-04-24 23:00:31

+6

你有一个'\ r'在某个引起它的地方。 (做'打印“hello \ r .. \ n”;'看看结果)。 Windows和\ * nix使用不同的EOL - 具体来说,\ * nix不使用'\ r'。如果您发布*实际示例*,我们可能会提供更多见解。 – 2012-04-24 23:02:49

+0

哦,这很有道理。我复制了从我的Windows分区读取的数据文件。非常感谢。 – user1126345 2012-04-24 23:35:46

回答

1

您需要提供特定的代码。我试着用这段代码:

#!/usr/bin/perl 

$_ = <>; 
if (($a) = $_ =~ m/(hello)/) { 
    print "it is equal\n" if ($a eq "hello"); 
    $a .= ".."; 
    print "$a\n"; 
} else { 
    print "unmatched\n"; 
} 

这应该重现你的问题,并且匹配成功。我正在运行linux,使用perl v5.14.2。输入“hello world”时,输出为:

it is equal 
hello.. 
2

该字符串以回车符结束。

print "hello\r..\n"; # Looks like "..llo" 

可在这些情况:

use Data::Dumper; 
local $Data::Dumper::Useqq = 1; 
print(Dumper($str)); 

也许是最好的解决办法是改变

chomp; 

s/\s+\z//; 

它修剪所有尾随空白,而不是仅仅尾随换行。