2011-01-13 12 views
0

このような単純な文で間違っていることを理解できません。問題は、ライン上で発生します。Perl:バックスラッシュをエスケープしない文字列

$this->_validate_hash($hashref->{$key}, $schemaref->{$key}, $path . (ref($hashref->{$key}) ? $key . "/" : "\\\@$key"), $errors);

だから私は物事が/path/to/some/\@attributeで終了します。しかし、私は現時点ではpath/to/some/\\@attributeです。私は'\\' . '@' . $keyまたは'\@' . $keyまたは'\\@' . $keyを含む最後の部分についてさまざまなコンボを試しましたが、私はまだバックスラッシュをエスケープできません。これは、私が気づいていないperlの文字列ではいくつかの奇妙なものですか?ありがとう。

+2

私のために働きます。可能な最小限のコードで再現できますか? – mkb

+1

さて、私はちょっとばかばかしいと感じます。それはうまくいきますが、ハッシュを印刷するときに値が一重引用符で囲まれているので、そうでないようです。したがって、 ''/path/to/some/\ @属性 ''は' 'key' => 'path/to/some/\\ @ attribute''としてレンダリングされます。助けてくれてありがとう :) –

答えて

1

これはではなく、という簡単なステートメントです。それは2つの行に分割され、あらゆる種類のものを含んでいます。私が見ることができる(と$xpathを仮定すると、スクリプト内の他の場所で使用されていない)などに近いように、これは、同じ結果を達成:

my $xpath = $path . (ref($hashref->{$key}) ? $key . "/" : "\\\@$key"); 
$this->_validate_hash($hashref->{$key}, $schemaref->{$key}, $xpath, $errors); 

しかし、それはより近い読みやすいです - それでも特に容易ではない、しかしよりもはるかに読みやすいですオリジナル。このコードはきれいに動作します

use strict; 
use warnings; 

my $key = "attribute"; 
my $path = "/path/to/some/"; 
my $localpath = $path . "\\\@$key"; 

print "Key: $key\n"; 
print "Path: $path\n"; 
print "Local: $localpath\n"; 

あなたの問題児

がに、それはそう、減少させることができるので、

Key: attribute 
Path: /path/to/some/ 
Local: /path/to/some/\@attribute 

を、どちらか私は別のPerlを持っている(これは5.12でした。 Linux x86/64の場合は1)、設定が異なることがあります。私たちがすべてのハッシュなどを持っていないことを考えれば、それを得るのは難しいでしょうが、あなたは同様の方法であなたの問題を打ち破るべきです。

関連する問題