كيف يمكنني مزج وسائط سطر الأوامر وأسماء الملفات لـ <> في بيرل؟
سؤال
النظر في برنامج 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;
لا تنتمي إلى StackOverflow