2

私のアプリケーションは、バックスラッシュでそれらのパスを終了している場合と終了していない場合があるユーザーからの多数のパスを受け入れます。他のさまざまな操作を実行するためにファイル名を追加できるように、すべてのパスがバックスラッシュ () で終了していることを確認したいと思います。ここで多くの質問を掘り下げましたが、解決策を見つけることができなかったため、次のことをまとめました。

    foreach my $path (@Path) {
      my $char = chop($path);
      if ($char ne '\\') {
        $path = $path . $char . '\\';
      } else {
        $path = $path . '\\';
    }

これはおそらくかなりひどい方法ですが、うまくいきます。誰かが私に正規表現の代替を提供できますか?

4

2 に答える 2

8

File::Specパスを構築するために使用します。それはより簡単で、より安全で、よりポータブルです。

use File::Spec;
for my $path (@Path) {
    $path = File::Spec->catfile($path, "foo", "bar");
    # $path = "$path\foo\bar"  -- regardless of previous line ending
}
于 2013-09-23T18:57:58.647 に答える
1
$path =~ s/(?<!\\)$/\\/;

(?<!\\)$前の文字がバックスラッシュではなく、文字列アンカーの終わりである場合、一致が失敗する原因となる否定的な後読みです。したがって、最後の文字がバックスラッシュの場合、この正規表現は何にも一致しません。または、その文字がバックスラッシュでない場合、文字列の最後の文字の後に一致します。次に、代わりにバックスラッシュを使用するため、正規表現が一致した場合は最後にバックスラッシュを追加します。

于 2013-09-23T18:45:48.747 に答える