Perl中的字母排序

Perl中的字母排序,perl,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-lin

下面是我得到的提示:编写一个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";

我犯的错误是关于命名的,但我的教授说我很接近。非常感谢您的帮助

好的,看。堆栈溢出不是“修复我的家庭作业”站点

您的代码—它不是perl<代码>使用严格
使用警告实际上会告诉您出了什么问题,但您有太多错误,很难理解

所以-从一开始就开始:

#!/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;
你这是什么意思?因为它已经在这一行中出错了,所以您可以到此为止,而不必查看代码的其余部分(目前,它有更多的错误)

你:

  • 使用
    my
    声明
    $numargs
  • 然后在名为
    $num_args
    的变量上使用名为
    string
    (不存在)的函数,该变量也不存在
也许你的意思是:

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

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

  • 分号是语句分隔符。通常是每行的末尾。你错过了很多
就perl而言,这意味着:

 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
    不是一回事。它们是完全不同的变量(但名称容易混淆,所以不要这样做)
  • 背景很重要。如果在标量上下文中使用
    @ARGV
    (例如,如果它是单个值),它将返回条目数的数字计数。见:
  • ARGV
    什么都不是
    @ARGV
    是一个包含命令行参数值的数组。见:
  • 空话不酷。引用应该是字符串的内容。如果它们是函数/子例程,请确保它们存在-
    string
    不存在,因为perl实际上没有“string”类型-它有标量。(见
  • 我认为您有一个逻辑错误。您测试
    $num_args!=2
    并退出-因此…基本上您的代码只能有两个参数。这与您的评论不一致
我不打算给你答案(你可能会被扣分,因为你的教授也可以用谷歌搜索),但作为一个提示,你可以在
@ARGV
上操作,根据你的规范,可以有大约一行实际代码来做你想做的事情。(如果你想给出一个关于输入不足的信息,可能有两行)


所以回溯一下。想想你实际上在做什么。你知道你的“来自命令行的任意字符串”是
@ARGV

你的代码看起来像是有人在尝试随机的东西,希望其中一个能起作用

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;
}
这无法编译。我认为您在我的$num_args eq string
末尾缺少分号。但即使这样,它也没有任何意义。您认为
string
是什么?而
eq
是一个比较运算符-您可能试图在此处使用它进行赋值

但是,除此之外,它没有任何逻辑意义。在上一节中,如果
$num_args
不等于2,您将退出程序。现在您正在检查
$num_args
是否大于2。此时
$num_args
唯一可能的值是2。2永远不会大于2

my @string = ARGV

if ( $string eq ARGV ) {
  my $string = ARGV;
}
还有一个分号丢失了,
ARGV
是一个文件句柄,而不是你想象中的数组

你需要退后一步,仔细看看这个问题。并从逻辑上思考解决方案。编程就是将问题分解成更小的步骤。如果你发现自己随意键入一些东西,希望某些东西能起作用,那么是时候休息一下了。绕着街区散散步,让头脑清醒一下

Perl的任务是使这样的工作变得简单。解决问题的代码只有一行

say foreach sort @ARGV;

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

嗨,Sobrique,非常感谢您的编辑!不幸的是,我仍然收到命名和“显式软件包”错误。是的,你们会的。我只是为了清晰和缩进而重新格式化了你们的代码,我并没有改变它的语义。你们是在要求别人重写你们的代码,现在看来,它不是perl。到了一个实际编译的点,你们可以解释你们不理解的东西,你们就有了一个更好的起点来提问s、 “我的教授说我很接近”真的吗?我可以向你保证:你真的没有。如果你本应该学习Perl一段时间,那么看起来你几乎什么都没学到。你需要再次彻底阅读笔记,开始理解别人告诉你的内容。如果我们为你做家庭作业,你什么也学不到。如果你真的想了解这些东西,并且课程还不够,您可能想买一本学习Perl的书。作为培训开发人员的一部分,请学习清楚地交流。大多数技术工作的一个重要部分是提出正确的问题。一旦你被问到,你就会发现这是一个问题没有足够的知识很难回答