【问题标题】:Spliting letters from an input into an array in perl在perl中将输入中的字母拆分为数组
【发布时间】:2018-04-23 23:08:54
【问题描述】:

我正在做一个项目,我需要从用户那里获取输入,然后将其切割成单独的字符以供以后使用(将它们向上移动一个字符),但我无法将输入输入一个数组并将其打印出来以检查它是否在那里。目前我的代码是

#!/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"

但是,当我在其中输入某些内容时,尽管有严格的警告并且没有返回任何内容,但只会打印出一个空白屏幕。我哪里做错了?

【问题讨论】:

  • while(&lt;@userarray&gt;) 在空数组上看起来有问题
  • 你需要分配@userarray outside循环
  • @MattJacob 这是一个拆分..根本不需要循环,对吗?
  • @zzxyz 当然,但 OP 暗示他/她出于某种原因想要单独迭代每个字符。但我同意...... split 只需要执行一次(并且可能不会掩盖第一个参数是正则表达式的事实)
  • 我删除了循环,它现在就像一个魅力

标签: arrays perl data-dumper


【解决方案1】:

&lt;D&gt; 在标量上下文中从文件句柄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
}

&lt;@userarray&gt; 不返回任何内容,因为 @userarray 肯定不是有效的文件句柄。所以这个循环永远不会进入。

如果您希望用户只输入一行,则根本不要使用循环。读取一行并将其拆分。

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

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

但该循环可能表明,您希望用户能够输入多行。如果是这样,循环直到没有输入(EOF),逐行读取输入。拆分行并将结果推送到您的数组中。

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

对于两种方式:chomp() 删除记录(行)末尾的尾随记录分隔符(新行)。如果您想保留这些,请不要使用它。我以为你没有。

【讨论】:

    【解决方案2】:

    这是一种常见的 Perl 模式。您想要循环以便用户可以输入更多数据。试试这样的:

    print "Input?";
    while (my $userinput = <STDIN>) {
      chomp $userinput; # remove trailing newline
      my @userarray = split //, $userinput; 
      print Dumper(\@userarray);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2022-01-16
      • 2016-05-21
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 2014-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多