2017-05-17 14 views
-5

ここに私が持っているプロンプトがあります:コマンドラインから任意の数の文字列を読み込み、アルファベット順に並べ替えて表示する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"; 

エラーは私の名前はついていますが、私の教授は私が近くにいると言っています。どんな助けでも大歓迎です!

+0

こんにちはSobrique、ありがとう、あなたの編集のために!残念ながら、私はまだ命名と "明示的なパッケージ"エラーを取得しています。 – Lily

+5

はい、そうです。私はちょうど明快さとインデントのためにあなたのコードを再フォーマットしました、私はそれがセマンティクスを変更していません。コードを書き直す人がいることを要求しています。それはそのままで、それはperlではありません。実際にコンパイルされるポイントに到達し、理解していないことを説明することができ、質問をするためのより良い出発点を得ることができます。 – Sobrique

+4

* "私の教授は私が近くにいると言った" *彼らは本当にでしたか?まあ、私はあなたを安心させることができます:あなたは本当にありません。あなたがしばらくの間Perlを学んでいたら、あなたはほとんど何も吸収していないように見えます。あなたはあなたのメモを徹底的に読んで、あなたが話されていることを理解して*始める必要があります。私たちがあなたの宿題をするなら、あなたは事を学ばないでしょう。 – Borodin

答えて

6

OK、ご覧ください。スタックオーバーフローは「私の宿題を修正する」サイトではありません。

コード - これはperlではありません。 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; 

あなたは何を意味するため、このを意図したのですか? でエラーが発生しています。この行はすでにですので、ここで停止して残りのコードを確認する必要はありません(現在のところ、エラーは増えています)。

あなたは:

  • 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)を使用する場合は、1つの値であるかのように)、エントリ数の数値カウントを返します。参照:perldata context
  • ARGVは何もありません。 @ARGVは、コマンドライン引数の値を含む配列です。を参照してください:perlvar
  • おかしな言葉はクールではありません。文字列であると思われるものを引用します。それらが関数/サブルーチンであれば、それらが存在することを確認します - stringは、実際には "文字列"型を持たないので、スカラーを持っています。 。。(あなたが$num_args != 2して終了をテストあなたは私が考える論理エラーを持っているperldata
  • を参照してください - 。そう...基本的にしか自分のコードに二つの引数を持つことができることは、あなたのコメントと対立します

私はあなたの教授がGoogleでもできるので、あなたに答えを与えるつもりはありませんが(あなたの教授はGoogleでも可能です)、ヒントとして - ちょうど@ARGVで操作でき、あなたのスペックを与えれば、実際にの1行を持つことができますあなたが望むことをするには(2つの可能性もあります。入力の欠如についてのメッセージを伝えたい場合は

ビット。あなたが実際にであることを考えてみてください。あなたは 'コマンドラインからの任意の文字列'が@ARGVであることを知っています。

+0

私は参照してください。私は間違って質問することをお詫びします! Perlは私にとって明らかに新しいものです - これは簡単でわかりやすいプロンプトであるはずですが、私はまだ配列で混乱しています。 – Lily

+1

OK。さて、私が提供できる最良の方法は、次の通りです:['perldoc perldata'](https://perldoc.perl.org/perldata.html)を読んでから、あなたが何を理解しているのかについて別の質問をしてください。可能であれば、問題がどのようなものかを示すサンプルコードスニペットを入力します。 – Sobrique

+3

* "' ARGV'は何もない "*' ARGV'は実際にはファイルハンドルです。 – Borodin

1

あなたのコードは、そのうちの1つがうまくいくことを期待してランダムなことをしようとしている人の外観を持っています。

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

これは有効なPerlです。 $num_argsが2に等しくない場合、プログラムは終了します。しかし、問題の定義によって、「任意の数の文字列を読み込むPerlプログラム」を書くように指示されました。なぜ2つの文字列が与えられていない場合は、なぜ終了するのですか?

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より大きいかどうかを確認しています。この時点で$num_argsが持つことができる唯一の可能な値は2です。決して2より大きくなることはありません。

my @string = ARGV 

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

他にもコンパイルできないものがあります。別のセミコロンがありません。ARGVはファイルハンドルですが、あなたが思っていると思われる配列ではありません。

質問をもう一度見直してみる必要があります。そして、ソリューションについて論理的に考える。プログラミングとは、問題をより小さなステップに分割することです。何かがうまくいくことを期待して自分でランダムに入力すると、時間がかかることになります。あなたの頭をきれいにするためにブロックを散歩に行く。

Perlの使命は、このような仕事を簡単にすることです。あなたの問題を解決するコードは1行です。

say foreach sort @ARGV; 

しかし、それがどのように動作するのか説明できない限り、解決策として提出しないでください。

+1

'eq'が文字列に対して' == 'と同等であれば、' = 'に相当する文字列の新しい代入演算子として' e'をプッシュする必要があります。難読化コンテストでもっと楽しいものになるでしょう... – simbabque

+0

@simbabque私はかつてLinkedInで "eq"がPerlの文字列代入演算子であると言われました。私はこれを教えてくれた人が深刻だと確信していますが、彼のコードがどのように働いたか分かりません。 –

+1

そうですか。その人が今OPの大学の教師になっているのでしょうか?別の注意点として、あなたの解決策は 'print 'が必要なわけではありません。なぜなら、' print'はリストでうまくいくからですが、 'say'や' join'や '$'を設定する必要があるかもしれません。コマンドライン引数をソートすると、入力に改行がなくなり、すべてが区切り文字なしで1つの長いソートされた文字列として返されます。 – simbabque

関連する問題