我试图在Perl中创建一个算法,只打印只有第一个字母为大写字母的单词。例如:
Hey
now
Brown cow
应该打印:
Hey
Brown
但它正在打印:
Hey
Brown cow
这是我的代码:
while (<>) {
if (/^[A-Z][a-z]+/) {
print;
}
}
print "\n"
答案 0 :(得分:2)
您目前正在打印以大写词开头的行。
要打印文字,您需要调整正则表达式以捕获单词:
while (<>) {
while (/\b([A-Z][a-z]+)/g) {
print $1, "\n";
}
}
或者单独开头,然后过滤出大写字样:
while (<>) {
for (grep /^[A-Z]/, split) {
print $_, "\n";
}
}
答案 1 :(得分:1)
以下内容应该有效:
while ( /\b([A-Z][a-z]*)\b/g ) { print $1 . $/; }
从单词边界(\b
)的开头开始,我们只需要一个大写字母([A-Z]
)。要完成这个单词,我们会允许任意数量的小写字母([a-z]*
),直到我们到达单词结尾(\b
)。
答案 2 :(得分:1)
你的正则表达不是骗你的。它匹配大写单词,但是你继续打印整行。
如果您只想打印匹配的单词,则以下内容应该有效:
my @words;
while (<>) {
@words = split(/\s+/);
foreach my $word (@words) {
print if (/^[A-Z][a-z]+/);
}
}
答案 3 :(得分:0)
你的正则表达式在行的开头建议大写单词。它还建议你不要考虑I
一个字。鉴于您感兴趣的角色,您可以使用 -
/^[A-Z](?i:[a-z])*/m and print $&,"\n";
我添加了多行修饰符,因为我无法告诉您用于行分隔符的内容。