perl - 尝试修改不可创建的数组值

标签 perl

我没有 Perl 经验,因此很难解决此错误。任何帮助表示赞赏。脚本如下(第40行报告问题,粗体):

#! /usr/bin/perl

print "Please enter filename (without extension): ";
$input = <>;
chomp ($input);

print "Please enter total no. of sequence in fasta file: ";
$orig_size= <>*2-1;
chomp ($orig_size);

open (INFILE, "$input.fasta") or die "Error opening input file for shuffling!";
open (SHUFFLED, ">"."$input"."_shuffled.fasta") or die "Error creating shuffled output file!";

@array = (0); # Need to initialise 1st element in array1&2 for the shift function
@array2 = (0);
$i = 1;
$index = 0;
$index2 = 0;

while (my @line=<INFILE>){
    while ($i<=$orig_size) { 

    $array[$i] = $line[$index];
    $array[$i]=~ s/(.)\s/$1/seg;

    $index++;
    $array2[$i] = $line[$index];
    $array2[$i]=~ s/(.)\s/$1/seg;

    $i++;
    $index++;
    }
}

my $array = shift (@array); 
**my $array2 = shift (@array2);**
for ($i = $header_size; --$i; ) { 
    my $j = int rand ($i+1);
    next if $i == $j;
    @array[$i,$j] = @array[$j,$i];
    @array2[$i,$j] = @array2[$j,$i];
}

while ($index2<=$header_size) { 
    print SHUFFLED "$array[$index2]\n";
    print SHUFFLED "$array2[$index2]\n";
    $index2++;
}
close(INFILE);
close(SHUFFLED);

最佳答案

错误:

Modification of non-creatable array value attempted

如上所述here :

You tried to make an array value spring into existence, and the subscript was probably negative, even counting from end of the array backwards.

让我相信你计算的行数是错误的,它指的是这个 block :

for ($i = $header_size; --$i; ) { 

这意味着您的循环已经进行得太远,并且 $i 已变为负数,并且超出了数组的大小。其原因是 $header_size 未定义(转换为零)。附带说明一下,如果您使用了正确的 for 循环,则不会存在此问题:

for ($i = $header_size; $i >= 0; $i--) 

或者更好的是,perl 风格的循环:

for my $i (0 .. $header_size)

即使这会以相反的顺序迭代,在这种情况下也没关系。

你的代码对我来说有点难以辨认,但我认为这个 block 是为了洗牌你的数组。为此,最好使用 List::Util 中的 shuffle 函数。模块。它是 perl v5.7.3 以来的核心模块。例如

use List::Util qw(shuffle);
...
my @shuffled_indexs = shuffle 0..$#array;
@array  = @array [@shuffled_indexes];
@array2 = @array2[@shuffled_indexes];

值得重复的是,在不使用的情况下编写代码

use strict;
use warnings;

确实是一个非常糟糕的主意。它将允许无提示的错误和拼写错误,并且会使您的调试变得更加困难。

关于perl - 尝试修改不可创建的数组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12357588/

相关文章:

perl:系统读取内存文件句柄?

perl - 如何打印特定时间后发生的日志文件中的行

Perl 同时替换多个字符串(不区分大小写)

perl - 从 DBIx::Class 中的 has_many 关系中检索数据

Perl MooseX::Method::Signatures 将自定义代码注入(inject)所有方法

perl - 是否可以在不写入的情况下检查 TCP 连接是否断开?

java - 对于这个小任务,我应该使用 Jython、JRuby、Beanshell、Groovy、Rhino 还是什么?

perl - 如何获取 Perl/Tk 文本小部件中的文本?

linux - 从 CSV 数据值中删除回车符

Perl + PostgreSQL--选择性列到行转置