1

我有一个字符串$str = 'Hello my friends';,我需要在\每个单词中添加一个字符并获得任何可能的变化。

例如在stdout我想得到

{H\ello|He\llo|Hel\lo|Hell\o} {m\y} {f\riens|fr\iends|fri\ends.....}

我写了一些代码,但我无法想象接下来要做什么:

my $str = 'Hello my friends';
my @ra = split / /, $str;
for(my $i=0; $i < scalar @ra; $i++)
{
    my $word = $ra[$i];
    my $num = length($word);
    my @chars = split("", $word);

    for(my $k = 0, my $l = 1; $l < $num; $k++,$l++)
    {
        print $chars[$k]."\\".$chars[$l];   
    }

}

有什么想法吗?=\

4

2 回答 2

2
my $str = 'Hello my friends';
$str =~ s{(\S{2,})}{
    my @alts;
    for my $i (1..length($1)-1) {
        my $slashed = $1;
        substr($slashed, $i, 0, '\\');
        push @alts, $slashed;
    }
    '{' . join('|', @alts) . '}'
}eg;
于 2012-10-27T20:51:27.613 回答
0

我建议您使用substr允许您提供第四个参数的工具,该参数提供一个新字符串,该字符串应该代替指定的子字符串。所以

my $string = 'ABCD';
substr $string, 2, 0, '\\';

将导致$string等于AB\CD

该程序使用此程序为您的问题提供了解决方案

use strict;
use warnings;

my $str = 'Hello my friends';

my @words = split ' ', $str;
my @new_words;

foreach my $word (@words) {
  my @list
  for my $i (1 .. length($word) - 1) {
    substr my $new_word = $word, $i, 0, '\\';
    push @list, $new_word;
  }
  push @new_words, join '|', @list;
}

my $new_str = join ' ', map "{$_}", @new_words;

print $new_str;

输出

{H\ello|He\llo|Hel\lo|Hell\o} {m\y} {f\riends|fr\iends|fri\ends|frie\nds|frien\ds|friend\s}
于 2012-10-27T20:50:45.483 回答