“我怎样才能解决问题?”;由于编译错误,-e的执行被中止。”;当我';我正在使用perl一行程序

“我怎样才能解决问题?”;由于编译错误,-e的执行被中止。”;当我';我正在使用perl一行程序,perl,Perl,我正在用Perl编写一个程序,它运行在MobaXterm上。我的问题是,我想让Perl运行Perl one liner(它通过另一个unix命令进行管道传输)。当我在终端中键入一行程序时,它工作得很好,但我似乎无法通过Perl使它工作 我在终端中的命令是 samtools view $file.bam | perl -ne 'if ($_ =~ m/NM:i:(\d+)/) {print $1, "chr(10)"}' > $file.nm 我用文件'M1.10.fasta' 我已复

我正在用Perl编写一个程序,它运行在MobaXterm上。我的问题是,我想让Perl运行Perl one liner(它通过另一个unix命令进行管道传输)。当我在终端中键入一行程序时,它工作得很好,但我似乎无法通过Perl使它工作

我在终端中的命令是

samtools view $file.bam | 
perl -ne 'if ($_ =~ m/NM:i:(\d+)/) {print $1, "chr(10)"}' > $file.nm 
我用文件
'M1.10.fasta'

我已复制了我的代码:

#!/usr/bin/perl -w

use strict;

my $read1 = 'Intesti-cocktail_R1.fastq'; 
my $read2 = 'Intesti-cocktail_R2.fastq'; 
my $dir = '/home/local1/balin/TestData/'; 

chdir($dir) or die "no dir"; #change directory 
opendir(DIR, '.') or die "no dir"; 
my @filelist = readdir(DIR); 
closedir(DIR); 

@filelist = grep(m/^M\d+\.\d+\.fasta$/, @filelist); # clean list of unwanted names


foreach my $file (@filelist) {
    my $cmd1 = "bwa index $file";
    my $cmd2 = "bwa mem $file $read1 $read2 | samtools view -Sb - > $file.bam"; 
    my $cmd3 = "samtools view $file.bam | perl -ne \"if ($_ =~ m/NM:i:(\\d+)/) {print $1, 'chr(10)'}\" > $file.nm";
    my $returnvalue1 = system($cmd1);
    my $returnvalue2 = system($cmd2);
    my $returnvalue3 = system($cmd3);
    print "Failed command1 ($returnvalue1): $cmd1\n" if $returnvalue1 != 0;
    print "Failed command2 ($returnvalue2): $cmd2\n" if $returnvalue2 != 0; 
    print "Failed command3 ($returnvalue3): $cmd3\n" if $returnvalue3 != 0;
}
我的错误消息是:

Use of uninitialized value $_ in concatenation (.) or string at Perl_BWAv2.pl line 21.
Use of uninitialized value $1 in concatenation (.) or string at Perl_BWAv2.pl line 21.
syntax error at -e line 1, near "( =~"
syntax error at -e line 1, near ";}"
Execution of -e aborted due to compilation errors.
Failed command3 (65280): samtools view M1.10.fasta.bam | perl -ne 'if ( =~ m/NM:i:(\d+)/) {print , "(10)"}' > M1.10.fasta.nm

您需要转义perl命令中的变量,以便它们不会被插值:

my $cmd3 = qq{samtools view $file.bam | perl -ne "if (\$_ =~ m/NM:i:(\\d+)/) {print \$1, 'chr(10)'}" > $file.nm};
#                                                      ^                             ^
但是,我建议不要产生新的perl进程,因为当您在当前perl脚本中执行操作时,它会使调试更容易:

open my $AM, '-|', 'samtools', 'view', "$file.bam" or die "Can't open samtools: $!";
open my $outfh, '>', "$file.nm" or die "Can't open $file.nm: $!";
while (<$AM>) {
    print $outfh $1, 'chr(10)' if m/NM:i:(\d+)/;
}
close $outfh;
打开我的$AM、-|'、'samtools'、'view'、“$file.bam”或die“无法打开samtools:$!”;
打开我的$outh,“>”、“$file.nm”或“无法打开$file.nm:$!”;
而(){
如果m/NM:i:(\d+/),则打印$outph$1,'chr(10)';
}
关闭$outph;

您需要转义perl命令中的变量,以便它们不会被插值:

my $cmd3 = qq{samtools view $file.bam | perl -ne "if (\$_ =~ m/NM:i:(\\d+)/) {print \$1, 'chr(10)'}" > $file.nm};
#                                                      ^                             ^
但是,我建议不要产生新的perl进程,因为当您在当前perl脚本中执行操作时,它会使调试更容易:

open my $AM, '-|', 'samtools', 'view', "$file.bam" or die "Can't open samtools: $!";
open my $outfh, '>', "$file.nm" or die "Can't open $file.nm: $!";
while (<$AM>) {
    print $outfh $1, 'chr(10)' if m/NM:i:(\d+)/;
}
close $outfh;
打开我的$AM、-|'、'samtools'、'view'、“$file.bam”或die“无法打开samtools:$!”;
打开我的$outh,“>”、“$file.nm”或“无法打开$file.nm:$!”;
而(){
如果m/NM:i:(\d+/),则打印$outph$1,'chr(10)';
}
关闭$outph;

在您的perl代码中,您将perl命令用双引号而不是单引号括起来;shell对这两个变量的处理方式完全不同,除非使用shell变量,否则应该使用单引号。恢复为单引号,并转义perl脚本不打算插入的$:

my $cmd3 = "samtools view $file.bam | perl -ne 'if (\$_ =~ m/NM:i:(\\d+)/) {print \$1, \"chr(10)\"}/ > $file.nm";

打印输入到系统的内容或打开的管道总是有帮助的。

在perl代码中,您将perl的命令括在双引号中,而不是单引号中;shell对这两个变量的处理方式完全不同,除非使用shell变量,否则应该使用单引号。恢复为单引号,并转义perl脚本不打算插入的$:

my $cmd3 = "samtools view $file.bam | perl -ne 'if (\$_ =~ m/NM:i:(\\d+)/) {print \$1, \"chr(10)\"}/ > $file.nm";

打印输入到系统的内容或打开的管道总是有帮助的。

此外,使用
打开我的$AM、-|'、'samtools'、'view'、“$file.bam”
等可能会避免从Perl调用Perl。@choroba添加了另一种方法。有效吗?据我猜测,它应该:-)此外,使用
打开我的$AM、-|'、'samtools'、'view'、“$file.bam”
等可能会避免从Perl调用Perl。@choroba添加了另一种方法。有效?据我猜测,它应该:-)