1

这是我的代码命名reverse.pl

#!usr/bin/perl -w
use 5.016;
use strict;

while(my $line=<>)
{
     my @array=();
     push (@array,$line);
     @array=reverse@array;
     say @array;
}

测试文件名为a.txt

A B C D 
E F G H
I J K L
M N O P
Q R S T

我的命令是perl reverse.pl a.txt

为什么它不能实现反向功能?我想显示的结果是:

D C B A 
H G F E

等等。

4

2 回答 2

4

标量上下文中的反转反转标量。列表上下文中的反转反转列表,但不是列表中的每个标量。您明确地将标量$line转换为包含一项的列表,然后颠倒各项的顺序。

尝试这个:

#!/usr/bin/perl
use 5.016;
use strict;

while (my $line=<>) {
    chomp($line);
    say scalar reverse $line;
}

如果您有一个数组并且想要反转每个元素(但不是元素),请使用map

my @array = qw(Alpha Beta Gamma);
@array = map { scalar reverse $_ } @array;
print "@array\n";

如果你想两者都做(反转每个元素和元素本身),请执行以下操作:

@array = map { scalar reverse $_ } reverse @array;

或者:

@array = reverse map { scalar reverse $_ } @array;
于 2013-08-20T23:22:51.420 回答
2

当你说:

push @array, $line;

您正在创建一个等于该行的一个值的数组。

$array[0] = "A B C D";

当你说:

@array = reverse @array;

您正在反转该单个成员数组。第一个元素成为最后一个元素,最后一个元素成为第一个元素,等等。但是,你只有一个元素,所以没有什么可以反转的。

你想要做的是用你的行创建一个数组:

my @array = split /\s+/, $line;

这将创建一个数组,其中每个字符都是数组的一个单独元素。例如,您的第一行:

$array[0] = "A";
$array[1] = "B";
$array[2] = "C";
$array[3] = "D";

现在,如果你reverse在这个数组上使用,你会得到:

$array[0] = "D";
$array[1] = "C";
$array[2] = "B";
$array[3] = "A";

这是程序:

use strict;
use warnings;
use feature qw(say);

while ( my $line = <> ) {
    chomp $line;
    my @array = split /\s+/, $line;
    say join " ", reverse $line;
}

join函数采用一个数组,并将每个元素连接成一行 - 从而重建您的行。

顺便说一句,我可以这样做:

   @array = reverse @array;
   say "@array";    #Quotes are important!

这是因为 Perl 会自动加入一个包含任何字符的数组$"。这是一个 Perl 变量,当数组放在引号中时用于连接数组,默认值为单个空格。

就个人而言,我更喜欢say join " ", reverse $line;. 发生了什么更明显,并且不依赖于很少使用的变量的值。

于 2013-08-21T00:50:06.823 回答