拆分后插入带有连接功能的冒号。 PERL

Inserting colon with join function after splitting. PERL


my $fruit; 
my $quantity = <STDIN>;
my $results = split(/,|:/,$quantity);
foreach my $result(@results){
    my ($fruit_name, $value) = split("=", @result);
    if($fruit_name == "apple") {
        $fruit = $value;
        my $ratio = join(":", $fruit);
        print "My ratio = $ratio";
     }
}

我的输出是:我的比率 = 12 来自输入:apple=1,apple=2.

我想要的输出:

My ratio = 1:2. 

感谢您的帮助。

也许这就是您想要做的

use strict;
use warnings;
use feature 'say';

chomp(my $quantity = <DATA>);               # chomp removes newline from input
my @results = split /[,:]/, $quantity;      # using [] to create a character class
my @nums;
foreach my $result (@results){              
    my ($fruit_name, $value) = split "=", $result;
    if ($fruit_name eq "apple") {           # have to use eq when comparing strings
        push @nums, $value;                 # store value for later printing
    }
}

say "My ratio = ", join ":", @nums;


__DATA__
apple=1,apple=2

输出:

My ratio = 1:2

您的代码存在这些错误。

  • 变量@result应该是$result。如果您启用了 use strict,您就会知道这一点。
  • 您在想要使用数值相等性测试 == 的地方使用了 = 赋值。由于您没有使用 use warnings,因此您对此一无所知。此外,您应该对字符串使用 eq
  • 您有一个变量 $value,您将其移至 $fruit,将其移至 $ratio。这是令人困惑和毫无意义的。
  • 您不能只对一个值使用 join。然后它什么都不做,因为您至少需要 2 个值才能加入。
  • 您的代码的输出是 My ratio = 1My ratio = 2,而不是 My ratio = 12

作为简化代码的替代方法,您可以将 hashref 用于水果的 array

use strict;
use warnings;
use feature 'say';

my($fruit,$item,$count);

for( split(',',<DATA>) ) {
        ($item,$count) = split('=',$_);
        push @{$fruit->{$item}}, $count;
}

say "My ratio = " . join(':', @{$fruit->{apple}});

__DATA__
apple=1,apple=2

输出

My ratio = 1:2