将数组值插入$ scalar-Perl

时间:2018-07-31 17:45:00

标签: arrays perl

如何将特定的数组值分配给$ skip? 我将从特定行开始从a.txt或b.txt中读取(a.txt为88,b.txt为64)

#!/usr/bin/perl
# Libraries
use strict;
use warnings;

# Main script
my @filename = ('a.txt', 'b.txt');
my @nrows = ('88', '64');

foreach my $file_input(glob("*.txt")) {
    open my $fh, '<', $file_input or die "can't read open $IN_FILE";
    for my $i (0 .. $#nrows) {
        if ( $file_input eq $filename[$i] ) {
            my $skip = $nrows[$i];
        }
    }
    $/ = "\n\n";  # record separator
    while( <$fh> ) {
    next unless '$skip' .. undef;
    my @lines = split /\n\n/;
    **... some manipulations ...**
}
close ($fh);
}

我收到以下错误:

Use of uninitialized value $skip in concatenation (.) or string at ./exercise.n24.pl line 14, <$fh> chunk 11.

最近4个小时我做了很多测试,但我不知道哪里错了

2 个答案:

答案 0 :(得分:3)

在这里我可以看到几个明显的错误。

您在立即结束的程序段中声明$skip

if ( $file_input eq $filename[$i] ) {
    my $skip = $nrows[$i];
}

所以您永远看不到$skip的值。

然后,当您尝试访问$skip时,请将其放在单引号中。而且变量不会用单引号引起来,因此Perl只是将其视为五个字符$skip。 / p>

但是我不认为这些都能解释您所看到的错误。示例代码中的哪一行是第14行。

如果您给我们提供了一个我们可以运行的代码示例,那么对我们而言,它就更加有用了。

我建议使用另一种方法,但恐怕还不清楚您要做什么。

答案 1 :(得分:1)

您得到的错误是因为在您的代码中,您试图在声明范围之内使用$skip

但是从更广泛的意义上来说,您似乎只是想根据文件名跳过一定数量的行。您应该为此使用哈希而不是并行数组。

use strict;    

my %lines_to_skip = (
    'a.txt' => 88,
    'b.txt' => 64
);

for my $file (glob("*.txt")) {
    my $skip = $lines_to_skip{$file};
    open my $fh, '<', $file;
    # local $/ = "\n\n"; # note that this would read the file in paragraph mode
    while (<$fh>) {
         next unless $. > $skip;
         # do something
    }
}