【发布时间】:2012-03-29 11:17:06
【问题描述】:
我的任务是从以下名为Lab1_table.txt 的数据文件中计算平均值:
retrovirus genome gag pol env
HIV-1 9181 1503 3006 2571
FIV 9474 1353 2993 2571
KoRV 8431 1566 3384 1980
GaLV 8088 1563 3498 2058
PERV 8072 1560 3621 1532
我必须编写一个脚本来打开和读取这个文件,通过将内容拆分成一个数组来读取每一行,然后计算数值的平均值(genome、gag、pol、@987654326 @),并将上述各列的平均值写入一个新文件。
我一直在尽力弄清楚如何不考虑第一行或第一列,但每次我尝试在命令行上执行时,我都会不断出现“显式包名称”错误.
Global symbol @average requires explicit package name at line 23.
Global symbol @average requires explicit package name at line 29.
Execution aborted due to compilation errors.
我了解这涉及@ 和$,但即使知道我无法更改错误。
这是我的代码,但我强调我是上周刚开始的初学者:
#!/usr/bin/perl -w
use strict;
my $infile = "Lab1_table.txt"; # This is the file path
open INFILE, $infile or die "Can't open $infile: $!";
my $count = 0;
my $average = ();
while (<INFILE>) {
chomp;
my @columns = split /\t/;
$count++;
if ( $count == 1 ) {
$average = @columns;
}
else {
for( my $i = 1; $i < scalar $average; $i++ ) {
$average[$i] += $columns[$i];
}
}
}
for( my $i = 1; $i < scalar $average; $i++ ) {
print $average[$i]/$count, "\n";
}
如果有任何见解,我将不胜感激,也非常感谢通过列出您在每个步骤中所做的事情来让我知道 - 如果合适的话。我想学习,如果我能够阅读某人的流程,这对我来说会更有意义。
【问题讨论】:
-
好的,我看到你已经牢记
use warnings和use strict的诫命。这就是您的错误的来源。您将“平均”声明为数组引用(有点),然后将其用作数组。尝试其中一个或另一个(但不是两者): 1. 将行更改为 @average 或 2. 使用$average->[i]正确取消引用注意,这不会解决整个问题,但它会消除错误消息为您服务,让您专注于逻辑。 -
哦,我只需要取消引用它。这确实消除了最后两个错误,你是对的,它并没有解决整个问题,因为我现在想出了这个:Can't use string ("5") as an ARRAY ref while "strict refs"在第 23 行,
第 2 行使用。我不确定这里发生了什么...... -
@PkC 您可能希望更新代码示例以显示代码的最新状态。这对调试更有帮助。
-
@PkC 并根据输入提供示例输出。欢迎来到 SO。
-
@Oalders - 感谢您的建议。不幸的是,出于某种原因,我的命令提示符不想在家里运行 perl,尽管出于某种原因它在大学工作。我不知道为什么,但它不断出现:'perl' 不被识别为内部或外部命令、可运行程序或批处理文件。即使我加载了 .bat 文件(与在大学工作的文件相同),也会出现这种情况。我也重启了电脑,还是不行。我还尝试不使用 'perl' 后跟我的 .pl 文件,结果只是出现了一个对话框,上面写着“选择要打开的程序...”