[英]Capitalizing words by uppercasing only the first letter
在Perl中,有ucfirst函数。
这是否等效于此:
sub uppercase {
my ($W) = @_;
$$W = uc(substr($$W,0,1)).substr($$W,1);
}
在Perl版本中有关系吗?
使问题上下文化, https://github.com/moses-smt/mosesdecoder/pull/206/files#diff-876e51db2a1ab71c1ae736182d1e5e04R63 ,
以前, uppercase
的用法如下:
sub process {
my $line = $_[0];
chomp($line);
$line =~ s/^\s+//;
$line =~ s/\s+$//;
my @WORD = split(/\s+/,$line);
# uppercase at sentence start
my $sentence_start = 1;
for(my $i=0;$i<scalar(@WORD);$i++) {
&uppercase(\$WORD[$i]) if $sentence_start;
if (defined($SENTENCE_END{ $WORD[$i] })) { $sentence_start = 1; }
elsif (!defined($DELAYED_SENTENCE_START{$WORD[$i] })) { $sentence_start = 0; }
}
# uppercase headlines {
if (defined($SRC) && $HEADLINE[$sentence]) {
foreach (@WORD) {
&uppercase(\$_) unless $ALWAYS_LOWER{$_};
}
}
但是似乎用ucfirst(\\$WORD[$i])
和ucfirst(\\$_)
替换&uppercase(\\$WORD[$i])
和&uppercase(\\$_)
ucfirst(\\$WORD[$i])
和ucfirst(\\$_)
是不同的。
在Perl中,有ucfirst函数。
这是否等效于此:
让我们找出...
$ cat testuc
use strict;
use warnings;
use Test::More;
sub uppercase {
my ($w) = @_;
return uc(substr($w, 0, 1)) . substr($w, 1);
}
my @tests = qw[foobar Foobar FOOBar fOObar fOObAR FOOBAR];
for (@tests) {
is(ucfirst($_), uppercase($_), "correct for $_");
}
done_testing;
$ prove -v testuc
testuc ..
ok 1 - correct for foobar
ok 2 - correct for Foobar
ok 3 - correct for FOOBar
ok 4 - correct for fOObar
ok 5 - correct for fOObAR
ok 6 - correct for FOOBAR
1..6
ok
All tests successful.
Files=1, Tests=6, 0 wallclock secs ( 0.04 usr 0.03 sys + 0.03 cusr 0.04 csys = 0.14 CPU)
Result: PASS
因此,是的,看起来它们是同一件事(至少对于我相当有限的一组测试而言)。
我正在使用Perl 5.26.1-但我认为这对于所有至少回到5.10的Perl版本都可以正常使用。
更新:
我对您的代码进行了无提示的编辑,我忘了提及。 您的代码最初是在对标量的引用上工作的,但是我将其更改为在标量( $W
而不是$$W
)上工作。 我认为那将是无害的替代。
但是现在您已经向我们展示了您在上下文中所做的更改 ,我可以看到发生了什么。
你有过:
&uppercase(\$WORD[$i])
您将其更改为:
ucfirst(\$WORD[$i])
这是不起作用的,因为ucfirst()
不会更改其参数。 它返回更改后的值。 所以您实际上想要:
$WORD[$i] = ucfirst($WORD[$i]);
然后,它将按预期工作(对其他答案中提到的Unicode字符问题进行模运算)。
如果您离开C样式的for
循环,则可以简化整个循环。
for my $w (@WORD) {
$w = ucfirst($w) if $sentence_start;
if (defined $SENTENCE_END{ $w }) {
$sentence_start = 1;
} elsif (!defined $DELAYED_SENTENCE_START{ $w }) {
$sentence_start = 0;
}
}
ucfirst
不等同于以下内容:
sub uppercase {
my ($W) = @_;
$$W = uc(substr($$W,0,1)).substr($$W,1);
}
ucfirst
主要是[1],等同于以下内容:
sub ucfirst {
my ($W) = @_;
return uc(substr($W,0,1)).substr($W,1);
}
如果要使用ucfirst
重写uppercase
,则如下所示:
sub uppercase {
my ($W) = @_;
$$W = ucfirst($$W);
}
uppercase(\$string);
这意味着,如果您想完全消除uppercase
,则应替换
uppercase(\$string);
与
$string = ucfirst($string); # Correct
您尝试使用
ucfirst(\$string); # Wrong
ucfirst
在处理更多深奥的字符(例如U + 01F3拉丁小写字母DZ(“dz”))方面做得更好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.