2012-04-24 36 views
-2

さて、私はナッツを動かす問題があります。perlで正規表現を使って部分文字列を抽出する

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

は、それが働いていますが、返された「string」は本当の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... 
} 
+0

正規表現にグループがありますか? – Cameron

+6

あなたはミックスのどこかでそれを引き起こしている '\ r'を持っています。 ( 'print" hello \ r .. \ n ";'を実行して結果を確認してください)。 Windowsと\ * nixは異なるEOLを使用します - 特に、\ * nixは '\ r'を使用しません。実際の例を投稿する*場合、追加の洞察力を提供することができます。 –

+0

オハイオ州は多くの意味があります。私は私のWindowsパーティションから読み込まれているデータファイルをコピーしました。どうもありがとう。 – user1126345

答えて

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.. 
2

文字列はキャリッジリターンで終わります。これらの状況で

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

便利:

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

は、おそらく最良の解決策は、変更され

chomp; 

s/\s+\z//; 

それだけではなく、後続のすべての末尾の空白をトリム

へ改行。

関連する問題