2

私はperlが初めてで、少し問題があります:

perl コードの一部:

print "${data_dir}\n";
#converting directory path to unix format (replacing all backslashes with slashes)
$data_dir = ~s/\\/\//g;
print "${data_dir}\n";

出力:

C:/dev/../data
4294967295

なぜ結果が異なるのですか?これは他の文字列でも機能するため、変数の問題だと思い$data_dirますが、何が問題になるのでしょうか?

PS$data_dir私は他のモジュールから取得していますが、それがどのように構築されているかわかりません。

4

4 に答える 4

11

= と ~ の間にスペースがあります。彼らは一緒にいるべきです=~。

$data_dir =~ s/\\/\//g;

あなたがしていたことは、s/\\/\//g4294967295 に等しい補数 (つまり ~ 演算子) に等しい $data_dir を設定することです。

于 2011-05-05T12:29:15.377 に答える
3

それは本当にスペースが入った「=〜」ですか?

スペースを入れずに「=〜」にする必要があります。現在、$data_dirに文字列のビット単位の否定値を割り当てています。

あなたは以下を使用していますね?

厳密に使用します。警告を使用します。

于 2011-05-05T12:32:28.077 に答える
2

他の人はすでに問題の原因で答えています-スペース= ~がないはずだった間=~のスペース。

貴重な教訓は、常にuse strictスクリプトに追加することです。そうすると、次のような警告が表示されます。

Use of uninitialized value $_ in substitution (s///) at (eval 11) line 4.

$_これは、置換演算子が上ではなく上で使用されていることを理解するのに役立ちます。これは、にバインド$data_dirするバインディング演算子の代わりに、があったためです。=~$data_dir= ~

ですから、学ぶべき教訓:常にuse strict-これは、1つの文字が間違っている可能性があるこのようなことをキャッチするのに役立ち、多くの時間を節約できます。

ちなみに、ファイルパスを操作し、プラットフォーム間の移植性を望む場合は、 File::Specを使用することをお勧めします。

于 2011-05-05T17:54:21.610 に答える
0

これは、s/..../g に数値演算子 (~) を適用しているためです。次のことを試してください。

$data_dir =~  s/...../g;
于 2011-05-05T12:30:48.373 に答える