perl كلمة ما هي أفضل الممارسات لتغيير الدلائل العمل داخل البرامج النصية؟



معنى كلمة surname (6)

هل تعتقد أن تغيير الدلائل داخل باش أو مخطوطات بيرل مقبول؟ أو يجب تجنب واحد القيام بذلك بأي ثمن؟

ما هي أفضل ممارسة لهذه المسألة؟


Answer #1

ومثلما قال هوغو، لا يمكنك التأثير على عملية الوالد الذي تقوم به الوالد حتى لا تكون هناك مشكلة.

حيث يكون السؤال أكثر قابلية للتطبيق إذا كنت لا تتحكم في العملية برمتها، كما هو الحال في روتين فرعي أو وحدة نمطية. في تلك الحالات التي تريد الخروج من الروتين الفرعي في نفس الدليل كما قمت بإدخال، وإلا عمل خفية على مسافة واحدة في زحف الذي يسبب البق.

يمكنك ذلك باليد ...

use Cwd;
sub foo {
    my $orig_cwd = cwd;
    chdir "some/dir";

    ...do some work...

    chdir $orig_cwd;
}

ولكن لديه مشاكل. إذا كان روتين فرعي يعود في وقت مبكر أو يموت (والاستثناء محاصر) التعليمات البرمجية الخاصة بك لا تزال في some/dir . أيضا، قد chdir تفشل وعليك أن تتذكر للتحقق من كل استخدام. بليه.

لحسن الحظ، هناك وحدات زوجين لجعل هذا أسهل. ملف :: بوشد هو واحد، ولكن أنا أفضل ملف :: تشدير .

use File::chdir;
sub foo {
    local $CWD = 'some/dir';

    ...do some work...
}

ملف :: تشدير يجعل الدلائل المتغيرة إلى تخصيص $CWD . ويمكنك توطين $CWD لذلك سيتم إعادة تعيين في نهاية نطاقك، بغض النظر عن ما. كما يتحقق تلقائيا إذا كان chdir ينجح ويرمي استثناء خلاف ذلك. في بعض الأحيان أنها تستخدم في البرامج النصية لأنها مجرد مريحة جدا.


Answer #2

النظر أيضا أن يونيكس ويندوز لديها المدمج في الدليل كومة: بوشد والبوبد . انها سهلة الاستخدام للغاية.


Answer #3

سوف أعلق على تعليقات شويرن وهوجو أعلاه. لاحظ تحذير سكويرن حول العودة إلى الدليل الأصلي في حالة حدوث خروج غير متوقع. وقدم رمز بيرل المناسب للتعامل مع ذلك. سوف أشير إلى قذيفة (باش، كورن، بورن) فخ الأمر.

تراب "سد $ save_dir" 0

سيعود إلى save_dir على خروج سوبسيل (إذا كنت''ing الملف).

ميكروفون


Answer #4

ل بيرل، لديك ملف :: بوشد وحدة من كبان مما يجعل محليا تغيير دليل العمل أنيقة جدا. نقلا عن الملخص:

  use File::pushd;

  chdir $ENV{HOME};

  # change directory again for a limited scope
  {
      my $dir = pushd( '/tmp' );
      # working directory changed to /tmp
  }
  # working directory has reverted to $ENV{HOME}

  # tempd() is equivalent to pushd( File::Temp::tempdir )
  {
      my $dir = tempd();
  }

  # object stringifies naturally as an absolute path
  {
     my $dir = pushd( '/tmp' );
     my $filename = File::Spec->catfile( $dir, "somefile.txt" );
     # gives /tmp/somefile.txt
  }

Answer #5

هل من الممكن عمليا محاولة استخدام المسارات الكمي ة بالكامل، وعدم إجراء أي افتراضات حول الدليل الموجود حاليا؟ على سبيل المثال

use FileHandle;
use FindBin qw($Bin);
# ...
my $file = new FileHandle("< $Bin/somefile");

بدلا من

use FileHandle;
# ...
my $file = new FileHandle("< somefile");

هذا ربما يكون أسهل على المدى الطويل، كما لم يكن لديك ما يدعو للقلق حول أشياء غريبة يحدث (السيناريو الخاص بك يموت أو قتل قبل أن يمكن وضع دليل العمل الحالي مرة أخرى إلى حيث كان)، ومن المحتمل جدا أكثر المحمولة .


Answer #6

دليل العمل الحالي محلي إلى قذيفة تنفيذ، لذلك لا يمكن أن تؤثر على المستخدم ما لم يكن "التنقيط" (تشغيله في شل الحالي، بدلا من تشغيله عادة إنشاء عملية قذيفة جديدة) البرنامج النصي الخاص بك.

وهناك طريقة جيدة جدا للقيام بذلك هو استخدام سوبشيلز، والتي غالبا ما تفعل في الأسماء المستعارة.

alias build-product1='(cd $working-copy/delivery; mvn package;)'

سوف بارانثسيس تأكد من تنفيذ الأمر من شبه قذيفة، وبالتالي لن يؤثر على دليل العمل من بلدي قذيفة. كما أنها لن تؤثر على آخر دليل العمل، لذلك سد -؛ يعمل كما هو متوقع.





zsh