1

我刚开始学习 perl,在我的书给出的示例代码中有这一行:

#!/usr/bin/perl
@lines = `perldoc -u -f atan2`;
foreach (@lines) {
s/\w<([^>]+)>/\U$1/g;
print;
}

代码有效,这不是问题。另外通过观察输入和输出,我知道这一行:

s/\w<([^>]+)>/\U$1/g;

做这个

ATAN2 ARCTANGENT TAN TANGENT <--- X<atan2> X<arctangent> X<tan> X<tangent>

还有这个

MATH::TRIG::TAN <------- C<Math::Trig::tan>

我的问题是:X 和 C 是从哪里来的?


仅供参考:如果我不使用代码,这是我的输出:

perldoc -u -f atan2
=over 8

=item atan2 Y,X
X<atan2> X<arctangent> X<tan> X<tangent>

Returns the arctangent of Y/X in the range -PI to PI.

For the tangent operation, you may use the C<Math::Trig::tan>
function, or use the familiar relation:

    sub tan { sin($_[0]) / cos($_[0])  }

The return value for C<atan2(0,0)> is implementation-defined; consult
your atan2(3) manpage for more information.

=back

这是代码的完整输出:

[/cygdrive/c/Users/Documents/learn_perl]$ ./hello_world.pl 
=over 8

=item atan2 Y,X
ATAN2 ARCTANGENT TAN TANGENT

Returns the arctangent of Y/X in the range -PI to PI.

For the tangent operation, you may use the MATH::TRIG::TAN
function, or use the familiar relation:

    sub tan { sin($_[0]) / cos($_[0])  }

The return value for ATAN2(0,0) is implementation-defined; consult
your atan2(3) manpage for more information.

=back
4

2 回答 2

3

替换正则表达式

s/\w<([^>]+)>/\U$1/g;

查找一个字母数字字符(示例文本中的 X 和 C),后跟<,捕获任何不是>,后跟 a 的字符>。然后它将捕获的字符串放回原处,并使用转义序列\U将其转换为大写。

我的问题是:X 和 C 是从哪里来的?

它们已经在 perldoc 文本中。然而,它们被替换正则表达式删除。也许您对输入和输出感到困惑。

于 2012-08-24T15:10:34.377 回答
0

你确定你没有混淆你的输入和输出吗?在我看来,该代码会将“z<something>”转换为“SOMETHING”。

于 2012-08-24T15:14:21.327 回答