Chinaunix

标题: perl 中*的语法是怎样的啊? 我查询了很多资料都找不到. 望指教~ [打印本页]

作者: rotknife    时间: 2006-08-13 09:54
标题: perl 中*的语法是怎样的啊? 我查询了很多资料都找不到. 望指教~
比如下面代码中有很多*号. 具体的语法是怎样的?
  1. if ($^O eq 'os2') {
  2.     local $^W = 0;

  3.     *cwd                = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
  4.     *getcwd             = \&cwd;
  5.     *fastgetcwd         = \&cwd;
  6.     *fastcwd            = \&cwd;

  7.     *fast_abs_path      = \&sys_abspath if defined &sys_abspath;
  8.     *abs_path           = \&fast_abs_path;
  9.     *realpath           = \&fast_abs_path;
  10.     *fast_realpath      = \&fast_abs_path;

  11.     return 1;
  12. }
复制代码

作者: 兰花仙子    时间: 2006-08-13 10:27
原帖由 rotknife 于 2006-8-13 09:54 发表
比如下面代码中有很多*号. 具体的语法是怎样的?
[code]if ($^O eq 'os2') {
    local $^W = 0;

    *cwd                = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd;
    *getcwd         ...


*看你怎么用了,在regex里*表示0个或多个符合匹配条件。

在这里的*是Perl的一种魔术变量的用法,等同于定义一系列函数别名,以后你用&cwd的时候,就等同于访问了sys_cwd()函数。*cwd定义了一个glob。
作者: rotknife    时间: 2006-08-13 11:37
还是不清楚。能说详细点吗?  比如下面的例子: 这里的*怎么理解?  谢谢。

  1. $fh = *STDOUT;

  2. --------------

  3. $fh = \*STDOUT;

  4. --------------

  5. sub newopen {
  6.     my $path = shift;
  7.     local *FH;          # not my() nor our()
  8.     open(FH, $path) or return undef;
  9.     return *FH;         # not \*FH!
  10. }
  11. $fh = newopen('/etc/passwd');

  12. --------------

  13. *foo = *bar;

  14. --------------

  15. *foo = \$bar;

  16. --------------

  17. local *Here::blue = \$There::green;
复制代码

作者: 兰花仙子    时间: 2006-08-13 12:59
STDOUT是Perl默认的标准输出的句柄,它始终在符号表里存在:

$ perl -le 'print "$_ -> $::{$_}" for keys %::' |grep STDOUT
STDOUT -> *main::STDOUT

对文件句柄而言,say STDOUT与say *STDOUT及say \*STDOUT都是一样的效果。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2