لماذا لا تعمل سطرتي الفردية عندما أسميها من لغة Perl؟
سؤال
ليس لدي مشكلة في استخدام الأمر التالي لـ AWK كأمر قائمة بذاتها ، دون أي خطأ:
$ awk '$9 != "NTM" && $9 != ""' myfile.txt | less -Sn
ولكن عندما أقوم بتطبيقها داخل البرنامج النصي لـ Perl لـ com.qsub (أي.تشغيل المهمة في نظام مجموعة Linux)، مثل هذا:
use strict;
use Data::Dumper;
use Carp;
use File::Basename;
my $path = "/mypath/";
my @files = glob($path."*.txt");
foreach my $file ( @files ) {
print "$file\n";
wy $base = basename($file,".fc-gn_".$type);
my $nn = $path.$base.".out";
print "$file $nn\n";
open PIPE, "| qsub" or die $!;
print PIPE <<EOF;
#!/bin/sh
#PBS -N CLEAN
#PBS -l nodes=1:ppn=2
#PBS -r n
awk '$9 != "NTM" && $9 !=""' $file > $nn
EOF
}
أعطى الخطأ التالي
awk: cmd. line:1: != "NTM" && !=""
awk: cmd. line:1: ^ syntax error
ما هي الطريقة الصحيحة للقيام بذلك؟
المحلول
ووضع طابع "\"
قبل كل المتغيرات "$9"
الخاص بك وسوف إصلاحه. كنت يجري تحليل من قبل بيرل نفسها.
والسيناريو التالي:
print <<EOF;
awk '$9 != "NTM" && $9 !=""' $file > $nn
EOF
والمخرجات:
awk ' != "NTM" && !=""' >
ولكن:
print <<EOF;
awk '\$9 != "NTM" && \$9 !=""' \$file > \$nn
EOF
والمخرجات:
awk '$9 != "NTM" && $9 !=""' $file > $nn
ولكن، منذ كنت تريد $file
و$nn
ليتم تفسيره من قبل بيرل، يجب أن يكون الخط الفعلي:
awk '\$9 != "NTM" && \$9 !=""' $file > $nn
نصائح أخرى
يمكنك استخدام حل الشرطة المائلة العكسية، أو جعله أكثر جاذبية من خلال استخدام:
print <<'EOF'
(ولا يوجد شرطة مائلة عكسية)، وأيضًا إذا كنت تحب لغة Perl، فقد ترغب في تجربتها gearman, ، انه حقا رائع.
لا تنتمي إلى StackOverflow