【问题标题】:Cannot open file handle from a variable无法从变量打开文件句柄
【发布时间】:2023-03-07 14:15:01
【问题描述】:

最初我运行了 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: $!";

我收到无法打开 $in 的错误消息,并且 qx() 命令的结果已打印在屏幕上。

我不明白为什么这不起作用以及如何使它起作用..

编辑:

打开行的错误是:

File name too long

【问题讨论】:

  • 比这个繁琐的代码更好的主意是使用一个设计来处理 SAM 格式的 Perl 模块,看看metacpan.org/search?q=sam+

标签: perl file-io


【解决方案1】:

shell 命令生成的字符串末尾可能包含换行符。通过chomp删除它:

chomp $in;

另外,请使用普通变量作为文件句柄:

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

【讨论】:

  • 应该添加 amon 在他的 die 中包含了 '$!'变量也有助于调试。
【解决方案2】:

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

当您尝试在其中使用 $in 时,我怀疑 shell 命令能否正常运行,并且它可能未定义。

如果你在脚本的顶部use strict; 可以发现这一点。

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 -S $in 中的 $in

编辑

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

我上面所说的仍然正确,但要更全面地解决您的问题,您需要执行以下操作:

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: $!";

第二次编辑,在 cmets 中回答问题:

为了逐行解析输出,你可以这样做:

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 $_ ...'

【讨论】:

  • 对不起,我意识到我使用了相同的变量 $in.. 我已经修改了问题。据我所见, qx() 实际上产生了预期的结果。这是重定向到不起作用的文件句柄部分
  • 是的,如果您尝试 amon 的建议或我的建议,您将看到更详细的错误。美元!会告诉你为什么你不能打开文件。
  • 好吧,你还没有尝试我的修复。您正在尝试打开您构建的命令的输出。您需要打开您编写的文件,该文件位于 $in 变量中,而不是 $read 变量中。
  • 你的解决方法是什么?我总是使用严格;在我的脚本顶部,你的意思是检查 $in?
  • 请在我的回答中尝试第二个代码块。当你应该有“open my $fh, '
猜你喜欢
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多