我正在尝试创建一个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的拼接来抓取一首歌曲,将其从数组中删除,因此随机选择不会因为从更小的阵列中选择而减慢。
从阅读回复中我可能走到了尽头,需要重新思考如何解决它。指针很受赞赏!
答案 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";