而Perl中的循环和菱形运算符

时间:2013-11-20 03:59:40

标签: perl

我正在尝试将文本文件输入到Perl程序并反转其行的顺序,即最后一行将成为第一行,第二行将成为第二行等。我正在使用以下代码

#!C:\Perl64\bin

$k = 0; 
while (<>){
    print "the value of i is $i";
    @array[k] = $_;
    ++$k;
}

print "the array is @array";

但由于某种原因,我的数组只打印文本文件的最后一行。 有什么建议吗?

3 个答案:

答案 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)。

因此,每次循环时,您都要将第一个元素设置为读入的行(覆盖上一次迭代中设置的值)。

其他一些提示:

  • @array []实际上是数组切片的语法而不是单个元素。它适用于这种情况,因为您要分配给1的切片。访问单个元素的常用语法是$ array []。
  • 我建议放置'use strict;'在你的脚本的顶部 - 你会得到一个错误,指出错误的引用$ k
  • 您可以将值推送到数组的末尾,而不是使用索引变量,例如:

    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);