كيف يمكنني مزج وسائط سطر الأوامر وأسماء الملفات لـ <> في بيرل؟

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

  •  23-09-2019
  •  | 
  •  

سؤال

النظر في برنامج Perl السخيف التالي:

$firstarg = $ARGV[0];

print $firstarg;

$input = <>;

print $input;

أديرها من محطة مثل:

perl myprog.pl sample_argument

واحصل على هذا الخطأ:

Can't open sample_argument: No such file or directory at myprog.pl line 5.

أي أفكار لماذا هذا؟ عندما يصل إلى <> هل تحاول القراءة من ملف (غير موجود) ، "Sample_argument" أو شيء من هذا القبيل؟ و لماذا؟

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

المحلول

<> هو اختصار لـ "قراءة من الملفات المحددة في @ARGV, ، أو إذا @ARGV فارغ ، ثم اقرأ من STDIN". في برنامجك ، @ARGV يحتوي على القيمة ("sample_argument"), ، وهكذا يحاول بيرل القراءة من هذا الملف عند استخدام <> المشغل أو العامل.

يمكنك إصلاحه عن طريق المقاصة @ARGV قبل أن تصل إلى <> خط:

$firstarg = shift @ARGV;
print $firstarg;
$input = <>;       # now @ARGV is empty, so read from STDIN
print $input;

نصائح أخرى

انظر صفحة Perlio Man ، التي تقرأ جزئيًا:

FileHandle null <> خاص: يمكن استخدامه لمحاكاة سلوك SED و AWK. تأتي الإدخال من <> إما من الإدخال القياسي ، أو من كل ملف مدرج في سطر الأوامر. إليك كيفية عملها: يتم تقييم المرة الأولى <> ، ويتم التحقق من صفيف ARGV ، وإذا كان فارغًا ، يتم تعيين $ argv [0] على "-" ، والذي يعطيك عند فتحه إدخالًا قياسيًا. ثم تتم معالجة صفيف ARGV كقائمة من أسماء الملفات.

إذا كنت تريد stdin ، استخدم stdin ، لا <>.

بشكل افتراضي ، يستهلك Perl وسيطات سطر الأوامر كملفات إدخال لـ <>. بعد استخدامها ، يجب أن تستهلكها بنفسك shift;

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