【问题标题】:Alternate between upper and lowercase, PERL大写和小写交替,PERL
【发布时间】:2015-01-24 10:40:21
【问题描述】:

我想在大写和小写之间交替,但是我只设法使整个字符串大写或小写,或第一个字符。 我还没有找到合适的功能来执行我需要的东西。请看看并帮助我。干杯。

#!/usr/bin/perl

my $mystring = "this is my string I want each character to alternate between upper and lowercase";

my @myarray = split("", $mystring);
print ucfirst("@myarray");

【问题讨论】:

  • 预期结果是什么? ThIs iS...ThIs Is...?

标签: perl


【解决方案1】:

使用函数工厂的更一般的方法

use strict;
use warnings;

sub periodic {
  my @subs = @_;
  my $i = 0;

  return sub {
    $i = 0 if $i > $#subs;
    return $subs[$i++]->(@_);
  };
}

my $mystring = "this is my string I want each character to alternate between upper and lowercase";

my $f = periodic(
  sub { uc pop },
  sub { lc pop },
  # sub { .. },
  # sub { .. },
);
$mystring =~ s/([a-z])/ $f->($1) /egi;
print $mystring, "\n";

输出

ThIs Is My StRiNg I wAnT eAcH cHaRaCtEr To AlTeRnAtE bEtWeEn UpPeR aNd LoWeRcAsE

【讨论】:

  • 如果有人感兴趣:不要写这个:$i = 0 if $i > $#subs;,这让我很困惑,你可以写:return $subs[$i++ % scalar @subs]->(@_);。换句话说,代码循环遍历 subs 数组(@subs)。
  • @7stud 是的,将计数器重置为零可以替代使用 % 取模。
【解决方案2】:

怎么样:

my $mystring = "this is my string I want each character to alternate between upper and lowercase";
my @myarray = split("", $mystring);
my $cnt = 1;
for (@myarray) {
    next unless /[a-z]/i;
    $_ = ($cnt%2 ? uc($_) : lc($_));
    $cnt++;
}
say join('',@myarray);

输出:

ThIs Is My StRiNg I wAnT eAcH cHaRaCtEr To AlTeRnAtE bEtWeEn UpPeR aNd LoWeRcAsE

【讨论】:

    【解决方案3】:

    我的第一个想法是使用正则表达式替换。试试这个:

    use strict;
    use warnings;
    
    my $str = "this string, I will change";
    
    # Ignore whitespace and punctuation.
    $str =~ s/(\w)(\w)/\L$1\U$2/g;
    
    # Or include all characters in the uc/lc alternation.
    # $str =~ s/(.)(.)/\L$1\U$2/g;
    
    print $str, "\n";
    

    如果出于某种原因,您希望避免使用正则表达式,请尝试:

    my $str = "this string, I will change";
    
    my @ary;
    my $count = 0;
    for my $glyph ( split //, lc $str ) {
        $glyph = uc $glyph if $count % 2;
        push @ary, $glyph;
        $count++;
    }
    print join( "", @ary ), "\n";
    

    【讨论】:

    • 在第一个解决方案中,当句子或单词包含奇数个字符时,您将遇到边缘情况。
    • 在阅读了您的第一个解决方案后,我意识到我的解决方案需要在备用替换上使用 \L...否则它将无法在“HELLO”上运行。
    • @TLP,不错的收获。没有错误,但是“HELLO”的结果将是错误的——因为匹配“LL”之后没有进一步的匹配,所以代码最终只对子字符串“HELL”进行替换,产生“hElLO”,这是不正确的.
    【解决方案4】:

    试试这个:

    use strict; 
    use warnings; 
    use 5.016;
    use Data::Dumper;
    
    my $str = 'hello';
    my $x = 0;
    
    $str =~ s/(.)/($x++ % 2 == 0) ? "\U$1" : "\L$1"/eg;
    say $str;
    
    --output:--
    HeLlO
    

    【讨论】:

      【解决方案5】:

      用名称alter.pl保存下面的脚本

      #!/usr/bin/perl
      print@ARGV[0]=~s/([a-z])([^a-z]*)([a-z])/uc($1).$2.lc$3/egri
      

      并通过命令运行脚本

      $ perl alter.pl "this is my string I want each character to alternate between upper and lowercase"
      

      输出

      ThIs Is My StRiNg I wAnT eAcH cHaRaCtEr To AlTeRnAtE bEtWeEn UpPeR aNd LoWeRcAse
      

      【讨论】:

        【解决方案6】:

        你已经有了一些很好的答案,但我想我会加入,因为我还没有看到 map

        print map { $c++ % 2 ? lc : uc } split ( //, $mystring );
        
        • 将$mystring 拆分为字符(split //);
        • 使用 map 将函数应用于每个字母。
        • 使用$c++ 自动递增,然后取模2 来决定是大写还是小写。
        • 加入结果数组。

        给予:

        #!c:\Strawberry\perl\bin
        use strict;
        use warnings;
        
        my $mystring = "this is my string I want each character to alternate between upper and lowercase";
        my $c;
        print join ( "", map { $c++ % 2 ? lc : uc } split ( //, $mystring ));
        

        打印:

        ThIs iS My sTrInG I WaNt eAcH ChArAcTeR To aLtErNaTe bEtWeEn uPpEr aNd lOwErCaSe
        

        map 是一个有用的函数,它将一些代码应用于列表中的每个元素,然后“返回”生成的列表。因此,如果我们将您的字符串视为字符列表,它会很好地工作。

        【讨论】:

          【解决方案7】:

          试试这个。简单的 if else 条件就足够了

          my $mystring = "this is my string I want each character to alternate between upper and lowercase";
          
          @xz = split( '', $mystring );
          for ( $i = 0; $i < scalar @xz; $i++ ) {
              if ( $i % 2 ) {
                  print uc "$xz[$i]";
              }
              else {
                  print "$xz[$i]";
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2016-07-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多