كيف يمكنني العثور على الدليل الرئيسي للمستخدم في بيرل؟

StackOverflow https://stackoverflow.com/questions/1475357

سؤال

أحتاج إلى التحقق مما إذا كان هناك ملف في الدليل الرئيسي للمستخدم، لذا استخدم التحقق من الملفات:

if ( -e "~/foo.txt" ) {
   print "yes, it exists!" ;
}

على الرغم من وجود ملف يسمى foo.txt. بموجب الدليل الرئيسي للمستخدم، يشكو بيرل دائما من عدم وجود مثل هذا الملف أو الدليل. عندما استبدل "~" مع / الرئيسية / جيمي (دعنا نقول المستخدم جيمي) ثم تمنح بيرل الحكم الصحيح.

هل يمكن أن توضح لماذا "~" لا تعمل في بيرل وأخبرني ما هو طريقة بيرل للعثور على الدليل الرئيسي للمستخدم؟

هل كانت مفيدة؟

المحلول

~ هو bash-مطور بدلا من perl-لاطلاع، وهذا هو السبب في أنه لا يعمل. بالنظر إلى أنه يبدو أنك على نظام من نوع UNIX، وربما أسهل الحل هو استخدام $HOME متغير البيئة، مثل:

if ( -e $ENV{"HOME"} . "/foo.txt" ) {
    print "yes ,it exists!" ;
}

ونعم، أعرف أن المستخدم يمكنه تغيير $HOME متغير البيئة ولكن بعد ذلك أود أن أفترض أنهم يعرفون ما يفعلونه. إذا لم يكن كذلك، فإنها تستحق كل ما يحصلون عليه :-)

إذا كنت تريد أن تفعل ذلك الصحيح الطريق، يمكنك النظر في ملف :: Homedir., ، وهذا هو الكثير من المنصة الواحد. يمكنك أن ترى ذلك في العمل في البرنامج النصي التالي chkfile.pl:

use File::HomeDir;
$fileSpec = File::HomeDir->my_home . "/foo.txt";
if ( -e $fileSpec ) {
    print "Yes, it exists!\n";
} else {
    print "No, it doesn't!\n";
}

ونص:

باكس $ touch ~ / foo.txt؛ بيرل Chkfile.pl نعم، إنه موجود! باكس $ rm -rf ~ / foo.txt؛ بيرل Chkfile.pl لا، هذا لا!

نصائح أخرى

لست متأكدا كيف غاب الجميع ملف :: Homedir.. وبعد إنها واحدة من تلك المهام الصلبة التي تبدو سهلة لأن أحد يعرف عن كل استثناءات الأنباء التي يجب أن تفكر فيها. لا يأتي مع بيرل، لذلك تحتاج إلى تثبيته بنفسك.

بمجرد معرفة الدليل الرئيسي، قم ببناء المسار الذي تحتاجه ملف :: المواصفات:

 use File::HomeDir qw(home);
 use File::Spec::Functions qw(catfile);

 print "The path is ", catfile( home(), 'foo.txt' ), "\n";

يمكنك غلوب tilde، glob('~/foo.txt') يجب أن تعمل. أو يمكنك استخدام ملف :: حفظ :: الصفحة الرئيسية الوحدة التي يجب أن تهتم أيضا بالأنظمة الأخرى.

يتم تخزين الدليل الرئيسي للمستخدم /etc/passwd. وبعد أفضل طريقة للحصول على المعلومات هي getpw* المهام:

#!/usr/bin/perl 

use strict;
use warnings;

print "uid:", (getpwuid 501)[7], "\n",
    "name:", (getpwnam "cowens")[7], "\n";

لمعالجة مشكلتك المحددة، جرب هذا الرمز:

if ( -e (getpwuid $>)[7] . "/foo.txt" ) {
   print "yes ,it exists!";
}

يحاول File::Path::Expand.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top