0

ユーザーからの入力を取得し、後で使用するために個々の文字に分割する必要があるプロジェクトに取り組んでいます (1 文字上にシフトするため) が、入力を配列に取得するのに問題があり、それを印刷して、そこにあることを確認します。現在、私のコードは

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $count=0;      # this block just creates variables
my $userinput;

print "Input?";      
$userinput=<STDIN>;   # this block just gets input and creates the array
my @userarray=();

while(<@userarray>) {
@userarray = split('', $userinput);   #this block should loop as many times as there are characters in the input while separating the characters
}

print Dumper(@userarray);   #this should print the array

入力が「家」の場合、出力は次のようになります。

@userarray[0]= "h"
@userarray[1]= "o"
@userarray[2]= "u"
@userarray[3]= "s"
@userarray[4]= "e"

しかし、何かを入力すると、厳密で警告が何も返されないにもかかわらず、空白の画面が表示されます。どこで私は間違えましたか?

4

2 に答える 2

4

<D>スカラー コンテキスト$/のファイル ハンドルから1 つ (次の) レコード (レコード セパレータが変更されていない場合は 1 行) を読み取り、返します。Dリスト コンテキストでは、残りのすべてのレコードが (配列として) 返されます。

と言いましたが、このセクションが問題です:

$userinput=<STDIN>;   # this block just gets input and creates the array
my @userarray=();

while(<@userarray>) {
@userarray = split('', $userinput);   #this block should loop as many times as there are characters in the input while separating the characters
}

<@userarray>@userarray確かに有効なファイルハンドルではないため、何も返しません。そのため、そのループには決して入りません。

ユーザーに 1 行だけ入力してもらいたい場合は、ループをまったく使用しないでください。1 行を読んで分割します。

$userinput=<STDIN>;   # this block just gets input and creates the array
chomp($userinput);
my @userarray=();

@userarray = split('', $userinput);

ただし、そのループは、ユーザーが複数の行を入力できるようにすることを示している場合があります。その場合、入力がなくなるまで (EOF) ループし、入力を 1 行ずつ読み取ります。行を分割し、結果を配列にプッシュします。

while(my $line = <STDIN>) {
  chomp($line);
  push(@userarray, split('', $line));
  print(join(',', @userarray) . "\n");
}

両方の方法:chomp()レコード (行) の末尾にある末尾のレコード セパレータ (改行) を削除します。これらを保持したい場合は、使用しないでください。私はあなたがしないと仮定しました。

于 2018-04-23T23:48:44.307 に答える