4

次のコードを検討してください。

print cwd . "\n";
$str= "../source"; # note the lower case 's'    
chdir($str);
print cwd . "\n";

私の現在のディレクトリがc:\parentdir\Source(大文字の「S」に注意)の場合、これの出力は次のようになります。

c:/ parentdir / Source
c:/ parentdir / source

これにより、フォルダ名の正しい大文字と小文字を区別する私のサブルーチンで問題が発生します。$ strがサブルーチンに渡されるので、正しい大文字と小文字が区別されるかどうかを事前に知ることはできません。一致するパスの大文字と小文字が正しい名前を判別するにはどうすればよい$strですか?

詳細はこちら:

  • それ../sourceは病理学的な例だと思いますが、それは問題を説明するのに役立ちます。$str現在のフォルダ以外のフォルダをリクエストしている場合でも発生します。
  • rel2abs、のグロブ検索 など、さまざまなオプションを試しましたが、すべて「 」ではなく$str「」が返されるようです。sourceSource
  • すべてのディレクトリを検索$str/..し、それらをすべて絶対パスに変換して、の絶対パスバージョンと比較することはできます$strが、それはハックのようです。もっとエレガントなものが欲しいと思っていました。
4

2 に答える 2

10
#!/usr/bin/perl

use warnings; use strict;
use Cwd;
use File::Spec::Functions qw( canonpath );
use Win32;

print canonpath( cwd ), "\n";

chdir '../source';

print canonpath( cwd ), "\n";

print canonpath( Win32::GetLongPathName( cwd ) ), "\n";
C:\ DOCUME〜1 \ ... \ LOCALS〜1 \ Temp \ t \ Source> t
C:\ DOCUME〜1 \ ... \ LOCALS〜1 \ Temp \ t \ Source
C:\ DOCUME〜1 \ ... \ LOCALS〜1 \ Temp \ t \ source
C:\ Documents and Settings \ ... \ Local Settings \ Temp \ t \ Source
于 2011-11-03T13:49:26.350 に答える
0

私はcygwinとsvnを使用していますが、大文字と小文字が区別されるためにsvnがファイルを見つけられなかったときに、この質問を見つけました。

例:$ cd / cygdrive / c / svn / delphi2010 / lib / checksum#本当の場合ではない

$ svn ls svn:警告:W155010:ノード'/ cygdrive / c / svn / delphi2010 / lib/checksum'が見つかりませんでした。svn:E200009:一部のターゲットが存在しないため、すべてのターゲットを一覧表示できませんでした

$ eval cd $(cygpath $(perl -le'use Win32; $ d = cygpath -aw .; chomp($ d); print Win32 :: GetLongPathName($ d)'))

$ pwd / cygdrive / c / svn / Delphi2010 / lib / CheckSum#ケースが復元されたことに注意してください

そしてsvnlsが再び機能します!

于 2020-03-13T21:17:22.317 に答える