-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 に答える