“我怎样才能解决问题?”;由于编译错误,-e的执行被中止。”;当我';我正在使用perl一行程序
我正在用Perl编写一个程序,它运行在MobaXterm上。我的问题是,我想让Perl运行Perl one liner(它通过另一个unix命令进行管道传输)。当我在终端中键入一行程序时,它工作得很好,但我似乎无法通过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' 我已复
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添加了另一种方法。有效?据我猜测,它应该:-)