我正在尝试将文本文件输入到Perl程序并反转其行的顺序,即最后一行将成为第一行,第二行将成为第二行等。我正在使用以下代码
#!C:\Perl64\bin
$k = 0;
while (<>){
print "the value of i is $i";
@array[k] = $_;
++$k;
}
print "the array is @array";
但由于某种原因,我的数组只打印文本文件的最后一行。 有什么建议吗?
答案 0 :(得分:4)
通常,perl程序使用push
运算符将字符串推送到数组上,而不是保留单独的数组索引。在您的计划中执行此操作的一种方法:
push @array, $_;
如果你真的想通过数组索引来做,那么你需要使用以下语法:
$array[$k] = $_;
请注意前面的$
而不是@
。这告诉perl你正在处理数组中的单个元素,而不是多个元素。 @array
为您提供整个数组,而$array[$k]
为您提供单个元素。 (有一个更高级的主题叫做“切片”,但是我们不会在这里讨论。我会说@array[$k]
给你一个切片,这不是你想要的。)
如果您真的只是想将整个文件粘贴到一个数组中,您可以一步完成:
@array = ( <> );
这将在一步中将整个文件读入@array
。
您可能已经注意到我忽略/忽略了您的print
语句。我不确定它正在打印出一个名为$i
的变量,因为它似乎根本没有连接到其余的代码。我推断这是你添加的调试代码,并不是与手头的任务真正相关。
无论如何,这应该让你输入@array
。现在反转数组......在perl中有很多方法可以做到这一点,但我会让你自己发现它们。
答案 1 :(得分:1)
而不是:
@array[k] = $_;
你想要:
$array[$k] = $_;
要引用标量变量$ k,您需要前面的$。如果没有它,它被解释为文字字符串'k',当用作数组索引时,它将被解释为0(因为非数字字符串将在数字上下文中被解释为0)。
因此,每次循环时,您都要将第一个元素设置为读入的行(覆盖上一次迭代中设置的值)。
其他一些提示:
您可以将值推送到数组的末尾,而不是使用索引变量,例如:
while (<>) {
push @array, $_;
}
答案 2 :(得分:0)
接受输入,直到找到单词end
解决方法1
#!/usr/bin/perl
while(<>) {
last if $_=~/end/i;
push @array,$_;
}
for (my $i=scalar(@array);$i>=0;$i--){
print pop @array;
}
溶液2
while(<>){
last if $_=~/end/i;
push @array,$_;
}
print reverse(@array);