-2

好吧,我有一个让我发疯的问题。我正在尝试使用正则表达式提取子字符串:

($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...
} 
4

2 回答 2

2

字符串以回车结束。

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

在这些情况下很有用:

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

可能最好的解决方案是改变

chomp;

s/\s+\z//;

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

于 2012-04-25T02:12:39.310 回答
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";
}  

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

it is equal
hello..
于 2012-04-24T23:12:01.253 回答