如何在 Perl 中反转句子中的单词?

klg*_*abs 5 perl

我正在尝试使用此代码反转一串单词。

use strict;
use warnings;

print "please enter words to reverse:\n";
my $string = <STDIN>;
chomp $string;

my $rstring = reverse $string;

print "$rstring\n";
Run Code Online (Sandbox Code Playgroud)

例如,当我输入时one two three,反义词应该是three two one。但我实际上得到了eerht owt eno.

为什么会这样?

sim*_*que 11

计算机不知道单词是什么。当你调用reverse一个字符串时,它会翻转所有的字符。但reverse也允许您翻转一系列事物,这在您的上下文中更有意义。

在列表上下文中,返回由 LIST 的元素以相反顺序组成的列表值。在标量上下文中,连接 LIST 的元素并返回一个字符串值,其中所有字符的顺序相反。

你需要把你的串进入名单的话,然后把那四周,然后再将其转换成字符串。

如果您查看您的字符串,您会注意到单词由空格分隔。

   V   V
one two three
Run Code Online (Sandbox Code Playgroud)

您可以split将字符串转换为这些空间上的数组。请注意,split以模式作为分隔符。

my @words = split / /, $string;
Run Code Online (Sandbox Code Playgroud)

现在你有一个words数组。

( 'one', 'two', 'three' )
Run Code Online (Sandbox Code Playgroud)

当您reverse这样做时,它将对元素执行此操作,而不是对其中的每个字符串执行此操作,因此您会得到

my @words = reverse split / /, $string;
# ( 'three', 'two', 'one' )
Run Code Online (Sandbox Code Playgroud)

最后,如果你想要把空间重新使用的相反split,以join再次名单成一个字符串。

print join ' ', reverse split / /, $string;
# three two one
Run Code Online (Sandbox Code Playgroud)

  • 迂腐地,这应该是`split //, $string, -1`,这样尾随空格就会像前导空格一样被保留(移到开头)(移到末尾) (2认同)