我想在大写和小写之间交替,但是我只设法将整个字符串设置为大写或小写,或者第一个字符。 我没有找到执行我需要的正确功能。请看看并帮助我。欢呼声。
#!/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");
答案 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 );
split //
); $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;产生的清单。因此,如果我们将您的字符串视为字符列表,它可以很好地工作。