7

重複の可能性:
Perlでユーザーのホームディレクトリを見つけるにはどうすればよいですか?

私はUbuntuを実行しています。

Perlスクリプトに~(たとえば~/Documents/file.txt)で始まるパスを渡すと、それを見つけることができません。正規のパスを通過する必要があります(例/home/dave/Documents/file.txt)。

何故ですか?

Perlに~パスを認識させることはできますか?

アップデート

提案されたすべての解決策には、スクリプトのコードを変更することが含まれます。スクリプト自体に変更を加えないソリューションが必要です(すべてが私のものではないため)。おそらく、Bashの動作に何か問題がありますか?

質問の更新バージョンがスーパーユーザーに投稿されました

4

6 に答える 6

8

パスを渡しglobて展開することができます。

于 2010-10-28T14:25:26.573 に答える
6

glob関数は、標準のUnixファイルグロブを理解します。

my $file = glob('~/Documents/file.txt');
于 2010-10-28T14:26:14.647 に答える
6

信頼性の高い(そして簡単な)クロスプラットフォームの方法については、File :: HomeDir:を試してください。

use File::HomeDir;
print File::HomeDir->my_home;
于 2010-10-28T14:39:43.893 に答える
4

に置き換え~てみてください$ENV{HOME}

于 2010-10-28T14:23:11.670 に答える
3

ブルーノのコメントから、あなたはそれをこのように行うことができます:

$path =~ s/^~(\w*)/ ( getpwnam( $1 || $ENV{USER} ))[7] /e;

eフラグは、式を、置換式を実行または評価した結果に置き換えます。

于 2010-10-28T16:28:12.023 に答える
3

二重引用符ではなく、角度引用符を使用します。

open(my $fh, "< :crlf :encoding(cp1252)",
              <~/Documents/file.txt>)
    || die "couldn't open Winblose text file ~/Documents/file.txt: $!";

<xxx>人々が通常関数のシンタックスシュガーと考える反復演算子は、xxxにシェルメタ文字がある場合readlineは代わりに関数を呼び出し、チルダはそれらの1つとしてカウントされます。glob

のオープンモードをお勧めします<:encoding(Latin1)。ファイルによって異なります。

于 2010-10-28T14:38:40.990 に答える