用perl中的regex提取子字符串

时间:2012-04-24 22:56:35

标签: regex linux perl

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

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

它正在工作,但返回的“字符串”与真正的substr不完全相同。打印字符串看起来像真正的substr,但用if($ var eq“substr”)检查不会返回true。我也注意到当我尝试用$ var。=“..”添加一些内容时;我得到(如果$ var是“你好”)“.. 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...
} 

2 个答案:

答案 0 :(得分:2)

字符串以回车符结束。

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

在这些情况下很有用:

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

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

chomp;

s/\s+\z//;

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

答案 1 :(得分: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..