我需要幫助調試下面顯示的代碼。我已經問過這個問題的類似版本,但我還沒有能夠開發一個可行的腳本。我的輸入文件是這樣的:全局符號和明確包名難以解決
一號線
AAAAAAAAAAAAAAA
2號線
BBBBBBBBBBBBBBB
3號線
CCCCCCCCCCCCCCC
4號線
DDDDDDDDDDDDDDD
我想腳本隨機洗牌文件中的行,如:
2號線
BBBBBBBBBBBBBBB
一號線
AAAAAAAAAAAAAAA
4號線
DDDDDDDDDDDDDDD
3號線
CCCCCCCCCCCCCCC
該文件中有相當多的線(〜1,000,000)。目前,我得到以下錯誤:
Global symbol "$header_size" requires explicit package name at fasta_corrector9.pl line 40.
和
Global symbol "$header_size" requires explicit package name at fasta_corrector9.pl line 47.
我不知道如何給$header_size
一個明確的包名。我不是程序員,所以我需要非常基本的解釋。提前致謝。
#! /usr/bin/perl
use strict;
use warnings;
print "Please enter filename (without extension): ";
my $input = <>;
chomp($input);
print "Please enter total no. of sequence in fasta file: ";
my $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!";
my @array = (0); # Need to initialise 1st element in array1&2 for the shift function
my @array2 = (0);
my $i = 1;
my $index = 0;
my $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 (reverse 0 .. $header_size) {
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);
你竟然想用一個詞彙('我的$ header_size;'),而不是通過明確其包名('$主:: header_size')使用一個包變量。你從來沒有給'$ header_size'一個值。 (我敢肯定,我已經在你的代碼中提到過這個問題了兩次!) – ikegami
你的意思是like(for($ i = my $ header_size; $ i> = 0; $ i--){)this?我被告知這是不正確的。我不知道如何給一個值(或給出什麼值)給$ header_size – user1569630
你需要給它賦值,然後在'for'中使用它,所以你需要這個變量早點存在,所以你必須儘早申報。再說一次,你永遠不會把一個值分配給'$ header_size',所以你需要'我的$ header_size = ...;'某處! – ikegami