PERL在大写和小写之间交替显示

时间:2015-01-24 10:40:21

标签: perl

我想在大写和小写之间交替,但是我只设法将整个字符串设置为大写或小写,或者第一个字符。 我没有找到执行我需要的正确功能。请看看并帮助我。欢呼声。

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

8 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

怎么样:

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

答案 2 :(得分:0)

试试这个:

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

答案 3 :(得分:0)

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

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";

答案 4 :(得分:0)

试试这个。这个

足够简单
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]";
    }
}

答案 5 :(得分:0)

使用名称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 :(得分:0)

可以通过正则表达式完成。

$mystring=~s/([a-z][^a-z]*)([a-z]?)/\u$1\l$2/gi;

这个人也会照顾最后一个孤独的角色。

如果你知道文字不会包含数字或下划线,那么它甚至可以打到更短的正则表达式。

$mystring=~s/(\w\W*)(\w?)/\u$1\l$2/g;

答案 7 :(得分:0)

你已经有了一些很好的答案,但我认为我已经填上了,因为我还没有看到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是一个非常有用的功能,可以将一些代码应用于列表中的每个元素,然后返回&#39;产生的清单。因此,如果我们将您的字符串视为字符列表,它可以很好地工作。