Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我的Perl代码没有实现反向函数吗?_Perl - Fatal编程技术网

为什么可以';我的Perl代码没有实现反向函数吗?

为什么可以';我的Perl代码没有实现反向函数吗?,perl,Perl,这是我的代号reverse.pl #!usr/bin/perl -w use 5.016; use strict; while(my $line=<>) { my @array=(); push (@array,$line); @array=reverse@array; say @array; } 我的命令是perl reverse.pl a.txt A B C D E F G H I J K L M N O P Q R S T 为什么

这是我的代号
reverse.pl

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

while(my $line=<>)
{
     my @array=();
     push (@array,$line);
     @array=reverse@array;
     say @array;
}
我的命令是
perl reverse.pl a.txt

A B C D 
E F G H
I J K L
M N O P
Q R S T
为什么不能实现反向功能? 我想展示的结果是:

D C B A 
H G F E

以此类推。

在标量上下文中,反转反转标量。 列表上下文中的反转将反转列表,但不会反转列表中的每个标量。 您可以显式地将标量
$line
转换为包含一个项目的列表,然后颠倒项目的顺序

试试这个:

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

while (my $line=<>) {
    chomp($line);
    say scalar reverse $line;
}
如果要同时执行这两项操作(反转每个元素和元素本身),请执行以下操作:

或:


标量上下文中的反转反转反转标量。 列表上下文中的反转将反转列表,但不会反转列表中的每个标量。 您可以显式地将标量
$line
转换为包含一个项目的列表,然后颠倒项目的顺序

试试这个:

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

while (my $line=<>) {
    chomp($line);
    say scalar reverse $line;
}
如果要同时执行这两项操作(反转每个元素和元素本身),请执行以下操作:

或:

当你说:

push @array, $line;
@array = reverse @array;
您正在创建一个数组,其中一个值等于该行

$array[0] = "A B C D";
当你说:

push @array, $line;
@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;
}
这是因为Perl将自动使用
$“
中的任何字符联接数组。这是一个Perl变量,当数组置于引号中时,用于联接数组,默认值为单个空格

就我个人而言,我更喜欢
say join”“,reverse$line;
。这更明显,不依赖于很少使用的变量的值。

当你说:

push @array, $line;
@array = reverse @array;
您正在创建一个数组,其中一个值等于该行

$array[0] = "A B C D";
当你说:

push @array, $line;
@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;
}
这是因为Perl将自动使用
$“
中的任何字符加入数组。这是一个Perl变量,当数组放在引号中时用于连接数组,默认值为单个空格



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

因为您没有拆分行,而是将其作为单个字符串插入。执行此操作,
print join(“,”,@array)
你看到多少个逗号?当你可以
反移位时,为什么要
-
?@vol7ron:为什么要使用数组?@KeithThompson:好问题-我假设他打算用数据做其他事情。@vol7ron:我假设他(不正确)他认为他需要一个数组来反转每一行。因为你没有拆分行,而是将其作为单个字符串插入。执行此操作,
print join(“,”,@array)
你看到多少个逗号?当你可以
反移位时,为什么要
-
?@vol7ron:为什么要使用数组?@KeithThompson:好问题-我假设他打算用数据做其他事情。@vol7ron:我假设他(不正确)认为他需要一个数组来反转每一行。你应该使用
chomp
,而不是
chop
。为什么要使用双重chomp?我不认为双重咀嚼对窗户有帮助;它删除行终止符(
$RS
使用英语;
下)。@kjpires:在Windows上,Perl自动从输入行删除
\r
,除非您要求它不要使用
binmode
选项。如果您要求它不要删除
\r
,那么
chomp
就不会这样做:它只会咀嚼尾随的
\n
,即使您在这种情况下尝试了两次,可能几乎在所有情况下,您真正想要的是
$line=~s/\s+\z/
删除所有尾随空格。@SinanÜnür:为什么你认为删除所有尾随空格是个好主意?如果输入行是
“foo”
,则输出应该是
“oof”
。您应该使用
chomp
,而不是
chop
。为什么要使用双重chomp?我不认为双重咀嚼对窗户有帮助;它删除行终止符(
$RS
使用英语;
下)。@kjpires:在Windows上,Perl自动从输入行删除
\r
,除非您要求它不要使用
binmode
选项。如果您要求它不要删除
\r
,那么
chomp
就不会这样做:它只会咀嚼尾随的
\n
,即使您在这种情况下尝试了两次,可能几乎在所有情况下,您真正想要的是
$line=~s/\s+\z/
删除所有尾随空格。@SinanÜnür:为什么你认为删除所有尾随空格是个好主意?如果输入行是
“foo”
,则输出应该是
“oof”