在Perl中按字母顺序排列

时间:2017-05-17 14:49:54

标签: perl

这是我的提示:编写一个Perl程序,从命令行读入任意数量的字符串 按字母顺序显示它们。这就是我所拥有的:

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

# read command line arguments


# verify correct input and display error and quit if input is valid
# (1) quit unless we have the correct number of command-line args
my $numargs = string $num_args = $#ARGV + 1;
if ( $num_args != 2 ) {

   exit;
}
if ( $num_args > 2 ) {
   my $num_args eq string
     print "Enter multiple random strings of letters, separated by spaces: ";
   exit;
}


# (2) If we get multiple command arguments, assume they are
# separate strings of random letters
my @string = ARGV

  if ( $string eq ARGV ) {
   my $string = ARGV;
}


# sort strings
my @sorted_string = sort @string;

# display sorted string

print "Here is your sorted list: "@sorted_string "\n";

我得到的错误是关于命名,但我的教授说我已经关闭了。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:6)

好的,看。堆栈溢出不是'修复我的功课'网站。

你的代码 - 它不是perl。 auct_lots_full use strict;实际上告诉您出了什么问题,但是您有这么多错误,很难理解。

所以 - 从头开始​​:

use warnings;

打算这是什么意思?因为它已经错误地 这一行,所以你可以停在那里而不用费心去看你的其余代码(现在,但它有更多的错误)。

您:

  • 使用#!/usr/bin/perl use strict; use warnings; # verify correct input and display error and quit if input is valid # (1) quit unless we have the correct number of command-line args my $numargs = string $num_args = $#ARGV + 1; 声明$numargs
  • 然后在名为my的变量上使用名为string的函数(不存在) - 它也不存在。

也许你的意思是:

$num_args

或者,只要您需要my $num_args = @ARGV; ,就可以在标量上下文中使用@ARGV

但是你的代码存在进一步的问题,这表明你并不真正理解:

  • 分号是语句分隔符。通常是每行的结尾。你错过了一堆。

就perl而言,这意味着:

$num_args

是一行代码:

 my $num_args eq string
   print "Enter multiple random strings of letters, separated by spaces: ";

这没有多大意义。

  • my $num_args eq string print "Enter multiple random strings of letters, separated by spaces: "; 表示标量变量。 $一个数组。但@自动知道“字符串”和“数字”之间的区别。 perl$string不是一回事。它们是完全不同的变量(但令人困惑的是,所以不要这样做)。
  • 背景很重要。如果您在标量上下文中使用@string(例如,就好像它是单个值),它将返回条目数的数字计数。请参阅:perldata context
  • @ARGV不是什么。 ARGV是一个包含命令行参数值的数组。请参阅:perlvar
  • Barewords并不酷。引用应该是字符串的东西。如果它们是函数/子例程确保它们存在 - @ARGV没有,因为perl实际上没有“字符串”类型 - 它有标量。 (见perldata
  • 我认为你有一个逻辑错误。你测试string并退出 - 所以...基本上只能有两个你的代码参数。这与你的评论不一致。

我不会给你答案(你可能会被标记下来,因为你的教授也可以google),但作为一个提示 - 你可以按$num_args != 2进行操作并给出你的规范,可以有大约一行实际代码来做你想要的。 (两个也许,如果你想传达一个关于缺乏输入的信息)

所以回溯一下。想想你实际上想要做什么。您知道'命令行中的'任意字符串'是@ARGV

答案 1 :(得分:1)

你的代码看起来像是在尝试随机的东西,希望其中一个可以工作。

if ( $num_args != 2 ) {
  exit;
}

这是有效的Perl。如果$num_args不等于2,它将退出程序。但是你对问题的定义告诉你写一个“读取任意数量字符串的Perl程序”。那么为什么要退出,如果你没有给出两个字符串?

if ( $num_args > 2 ) {
  my $num_args eq string
  print "Enter multiple random strings of letters, separated by spaces: ";
  exit;
}

这不编译。我认为你在my $num_args eq string结束时遗漏了一个分号。但即使这样也毫无意义。您认为string是什么? eq是一个比较运算符 - 您可能会尝试在此处使用它来进行赋值。

但是,除此之外,它没有逻辑意义。在上一部分中,如果$num_args不等于2,则退出该程序。现在您要检查$num_args是否大于2.唯一可能的值{{1}此时可以得到2.而且2永远不会超过2。

$num_args

其他甚至无法编译的东西。还有一个分号丢失,my @string = ARGV if ( $string eq ARGV ) { my $string = ARGV; } 是一个文件句柄,而不是你认为它的数组。

你需要退后一步,仔细看看这个问题。并从逻辑上思考解决方案。编程是将问题分解为更小的步骤。如果你发现自己随意输入东西,希望能有所作为,那么就该抽出时间了。在街区附近散步,清理头脑。

Perl的使命是让这样的工作变得简单。解决问题的代码是一行。

ARGV

但请不要将其作为您的解决方案提交,除非您能解释它是如何运作的。