代码之家  ›  专栏  ›  技术社区  ›  tavalendo

在Perl中动态存储变量

  •  1
  • tavalendo  · 技术社区  · 7 年前

    我试图在Perl中动态地存储和打印变量,方法是要求用户输入要创建的变量数,然后要求每个已创建的变量添加信息,然后输出每个变量中包含的文本长度。在我的脑海里我想到了这个:

    use strict;
    use warnings;
    
    sub main {
    
        my %VarStore = ();
    
        print ("How many variables to create: ");
        chomp(my $varNum = <STDIN>);
    
        my $counter = 1
        while ($counter <= $varNum) {
            print "Enter text to variable $counter: \n";
            chomp(my $buffer = <STDIN>);
            $VarStore{'var'$counter} = $buffer;
            $counter ++;
        }
    
        while ($counter <= $varNum) {
            print "Variable $counter is length($VarStore{'var'$counter}) character  long \n";
            $counter ++;
        }
    
    
    }
    

    > How many variables to create: 3
    > Enter text to variable 1: ABCQWEPOL
    > Enter text to variable 2: xJSAG!HHKSKASK
    > Enter text to variable 3: KakA
    > Variable 1 is 9 character long
    > Variable 2 is 14 character long
    > Variable 3 is 4 character long
    

    你知道为什么我的代码不起作用吗?我在这里想到了一个散列,这样我就可以创建动态变量,比如带有var1、var2、var3等键的变量,这取决于用户为创建它们所提供的输入。提前谢谢。

    1 回复  |  直到 7 年前
        1
  •  8
  •   Grinnz    7 年前

    你说得对,散列是解决这个问题的好方法。你的代码有两个问题。第一, $VarStore{'var'$counter} 无效语法,需要使用 . $VarStore{'var'.$counter} $VarStore{"var$counter"} .

    与变量不同,您不能直接将函数调用插入字符串,因此length()调用应该单独进行。或者,也可以将字符串与函数调用连接起来。 print "Variable $counter is " . length($VarStore{"var$counter"}). " long\n";

    $counter = 1;

    使用起来可能更简单 foreach loops main();

    use strict;
    use warnings;
    
    my %VarStore;
    
    print ("How many variables to create: ");
    chomp(my $varNum = <STDIN>);
    
    foreach my $counter (1..$varNum) {
        print "Enter text to variable $counter: \n";
        chomp(my $buffer = <STDIN>);
        $VarStore{"var$counter"} = $buffer;
    }
    
    foreach my $counter (1..$varNum) {
        my $length = length($VarStore{"var$counter"});
        print "Variable $counter is $length character  long \n";
    }