在Perl中将文件加载到带尺寸的数组中

时间:2016-03-04 15:44:21

标签: arrays perl multidimensional-array

我正在尝试创建一个perl脚本来将文件内容加载到一个带尺寸的数组中,它似乎不起作用。任何帮助将不胜感激!

这就是我正在尝试的但它没有用。

#!/bin/perl
use List::Util qw(first);
@filelist = ("file1", "file2", "file3");

sub Load_File{
  my $File_Name = shift;
  open my $handle, '<', $File_Name;
  chomp( my @lines = <$handle>);
  close $handle;
  return @lines;
}


$filelist[0] = Load_File(@filelist[0]);

print "$filelist[0][1]\n";

我的预期结果是$ filelist [0]到==“file1”和$ filelist [0] [0]返回文件的第一行,每个后续的子数组条目都是文件中的一行

数据格式可视化

$filelist[0] == "file1"
$filelist[0][0] == "Line1 of file1"
$filelist[0][1] == "Line2 of file1"
$filelist[0][2] == "Line3 of file1"
$filelist[1] == "file2"
$filelist[1][0] == "Line1 of file2"
$filelist[1][1] == "Line2 of file2"
$filelist[1][2] == "Line3 of file2"
etc.

那么我做错了什么?

谢谢

UPDATE /澄清:

感谢您的回复和澄清!

看起来我错了。我正在尝试制作一个自动随机播放列表生成器。目的是设置文本文件,这些文件只是歌曲位置的列表,每个文本文件都是给定的类型。然后让脚本从每个类型中随机选择一首或多首歌曲并输出随机M3U播放列表。允许我在给定点设置某些类型。喜欢选择4首乡村歌曲,然后是1首硬摇滚,然后是另外3首。

我的想法是在数组为空时使用维度数组,将其从文件列表中删除。使用与rand的拼接来抓取一首歌曲,将其从数组中删除,因此随机选择不会因为从更小的阵列中选择而减慢。

从阅读回复中我可能走到了尽头,需要重新思考如何解决它。指针很受赞赏!

4 个答案:

答案 0 :(得分:1)

Load_File返回一个列表,因此不应将其分配给标量值$filelist[0]。而是将其分配给引用Load_File返回的数组。

$filelist[0] = [ Load_File($filelist[0]) ];

答案 1 :(得分:1)

你无法在Perl(以及许多其他语言)中获得这样的结构。您的每个第二级实际上是一个单独的数组,您的第一级数组单元将这些子数组作为值引用。所以$filelist[0] = [ "Line1 of file1", "Line2 of file1", "Line3 of file1" ]$filelist[0]不能同时为"file1"[...]

(嗯,我们正在谈论Perl,所以实际上你可以,因为有足够的内部知识,你可以做很多疯狂的事情。但你真的不应该去你的水平,即使你发现如何做到这一点,你不应该这样做,因为它是不可读和不可持续的。)

答案 2 :(得分:1)

你可能想要一组数组。 Perl数组的每个元素都是标量值,这意味着如果需要第二级数组,则必须使用数组引用

您可以编写类似这样的内容,将load_file返回的列表复制到匿名数组中并将其插入@filelist

#!/bin/perl

use strict;
use warnings 'all';

my @filelist = qw/ file1 file2 file3 /;

sub load_file {
    my $file_name = shift;
    open my $handle, '<', $file_name;
    chomp( my @lines = <$handle> );
    return @lines;
}

$filelist[0] = [ load_file( @filelist[0] ) ];

print "$filelist[0][1]\n";

但更改load_file以便通过编写

返回对其自己的数组的引用会更有效
return \@lines;

然后您可以按原样保留其余代码。

但是,除非您需要不止一次致电load_file,否则写下此内容会更多Perlish

#!/bin/perl

use strict;
use warnings 'all';

my @filelist = map {
    open my $fh, '<', $_;
    chomp ( my @lines = <$fh> );
    \@lines;
} qw/ file1 file2 file3 /;

print "$filelist[0][1]\n";

确定你的perl可执行文件是/bin/perl吗?

答案 3 :(得分:0)

您的子程序返回一个列表。

要使列表成为数组元素,您必须存储数组引用。

sub Load_File{
 # ...
   return \@lines;
}

要访问第一行,请使用索引0。

print "$filelist[0][0]\n";