Perl 无法从变量打开文件句柄

Perl 无法从变量打开文件句柄,perl,file-io,Perl,File Io,最初,我运行shell脚本并将输出定向到一个文件中,然后使用Perl读取并解析该文件。我想将这两个步骤合并到一个Perl脚本中 我试着写下这样的东西: my $in = 'file.txt'; my $read = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}'); open (IN,"<",$read) || die "cannot open $read: $!"; my $i

最初,我运行shell脚本并将输出定向到一个文件中,然后使用Perl读取并解析该文件。我想将这两个步骤合并到一个Perl脚本中

我试着写下这样的东西:

my $in = 'file.txt';
my $read = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}');

open (IN,"<",$read) || die "cannot open $read: $!";
my $in = 'file.txt';
my $cmd_output = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}');

open my $fh, '<', $in or die "ERROR: Couldn't open $in for reading: $!";
foreach my $line (split /\n/, $cmd_output) {
    // Do something with $line
}

shell命令生成的字符串末尾可能包含一个换行符。通过chomp将其移除:

此外,请对文件句柄使用普通变量:

open my $fh, "<", $in or die qq(Can't open "$in": $!);

代码将读取已运行的shell命令的输出,并将输出写入STDOUT的任何内容存储在$in中

我怀疑shell命令能否正确运行,因为您试图在其中使用$in,而且它可能没有定义

如果你使用严格的命令,你可以发现这一点;在脚本的顶部

my $in = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}');

// No need to open anything here, just inspect $in
我不熟悉“samtools”,但您可能需要修复shell命令并使用正确的东西,而不是view中的$in-S$in

编辑:

好的,您是说您的shell命令写入一个文件,然后您想读取该文件。我误解了

我上面所说的仍然是正确的,但要更全面地解决您的问题,您需要这样做:

my $in = 'file.txt';
my $read = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}');

open (IN,"<",$read) || die "cannot open $read: $!";
my $in = 'file.txt';
my $cmd_output = qx(samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}');

open my $fh, '<', $in or die "ERROR: Couldn't open $in for reading: $!";
foreach my $line (split /\n/, $cmd_output) {
    // Do something with $line
}
老实说,您甚至会发现在shell上使用以下工具更容易做到这一点:

$ samtools view -S $in |cut -f 3|sort|uniq -c|awk '{OFS="\t";print \$2,\$1}' | perl -lne '... do something with $_ ...'

应该补充的是,阿蒙在他的死亡中包含了“$!”变量,这也有助于调试。比这个繁琐的代码更好的方法是使用一个Perl模块来处理SAM格式,很抱歉,我意识到我使用了相同的变量$in。。我已经修改了这个问题。据我所见,qx实际上产生了预期的结果。是的,如果您尝试amon的建议或我的建议,您将看到一个更详细的错误。美元!我会告诉你为什么你不能打开这个文件。好吧,你仍然没有尝试我的修复。您正试图打开已构造的命令的输出。您需要打开已写入的文件,该文件位于$in变量中,而不是$read变量中。您的解决方案是什么?我总是严格使用;在我的脚本顶部,你的意思是检查$in?请尝试我答案中的第二段代码。你已经打开了我的$fh,'