2

Windows でパスを格納する変数があります。パス内のすべての \ を / に置き換えたい。

たとえば。$path = C:\Users\scripts.ps1

Perlが初めてで、次のようなことを試しました

$path = s/\\////

しかし、うまくいきませんでした。私を助けてくれませんか....

4

5 に答える 5

10

これを行うクロスプラットフォームの方法が必要な場合は、File::Specを使用してください。

($volume,$directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );

次に、を使用catpathして再度参加します。

于 2010-05-04T11:54:29.153 に答える
6

あなたの試みはほぼ正しかった。詳しく見てみましょう。

$path = s/\\////
             ^

まず、変数に対して置換を実行するには、単純な代入演算子だけでなく、バ​​インド演算子使用する$path必要があります。次に、通常のスラッシュ文字を置換区切り文字として使用したため、上記のスラッシュは実際には置換コマンドの終わりを示しており、残りの 2 つのスラッシュはゴミです。キャラクターの特別な特性をバイパスするためのルールは、それを2倍にすることだと思ったかもしれません. 唯一の例がバックスラッシュの場合、そのルールは理にかなっているかもしれませんが、実際のルールは特殊文字の前にバックスラッシュを付けることです。強調表示されたスラッシュをバックスラッシュに置き換えると、エスケープ文字になります=~、そのため、次のスラッシュの特別な関数をバイパスして単純なスラッシュとして扱い、その後のスラッシュで置換を適切に終了できるようにします。

$path =~ s/\\/\//

しかし、それは読みにくいです。幸いなことに、置換区切り文字としてスラッシュを使用する必要はありません。必要なほぼすべての文字を使用できます。置き換えようとしているテキストに似ていない区切り文字を選択すると、コードが読みやすくなります。詳細はQuote および quote-like operator の下のperlopにあります。選択した文字が別の文字とペアを形成する場合は、両方を使用して式の 2 つの部分を囲みます。さらに、おそらく文字列内のすべてのスラッシュを置き換えたいので、修飾子を最後に使用して、最初の置換後に停止するのではなく、グローバルに一致するように指示する必要があります。すべてをまとめる:g

$path =~ s{\\}{/}g

1 つの文字を別の 1 つの文字に置き換えているため、より特殊な音訳演算子trを使用できますs。自動的にグローバルに適用されます。

$path =~ tr{\\}{/}

最後に、これが 1 回限りのパス操作以上のものである場合 (つまり、スクリプトでこれを複数回実行するか、スクリプトがしばらく維持される場合)、または複数のプラットフォームで同じコードを実行する必要がある場合は、File::Specモジュールの使用を検討してください。実行しているプラ​​ットフォームに適したセパレーターを使用して、パス コンポーネントを分割および結合できます。

于 2010-05-04T13:29:58.620 に答える
4

trいくつかの種類については、演算子についても言及しましょう

$path =~ tr!\\!/!;

また

$path =~ y!\\!/!;

\のすべてのインスタンスを/で置き換えます$path

于 2010-05-04T09:11:50.300 に答える
3

別のパターン区切り文字を使用する場合、スラッシュをエスケープする必要はありません。

$path =~ s!\\!/!g;
于 2010-05-04T08:50:23.713 に答える
3

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

最後のは、最初の出現のみではなく、出現をg置き換えます。\

于 2010-05-04T08:47:40.683 に答える