Perl函数($$)表单有什么特殊之处?

Perl函数($$)表单有什么特殊之处?,perl,Perl,我继承了表格的功能: sub func($$) { } 我更习惯于看到: sub func { ## then extract params using shift for example } 我查了一下$,这是获取当前进程ID的一种方法。但从函数看,这里似乎没有使用进程ID。那么,$在这个上下文中是否意味着其他的东西呢 我感到困惑的函数如下所示。为什么使用($$) 使用文件句柄; #函数的结构与此非常相似-仅更改名称 子消息($$) { 我的$string=shift; 我的$fil

我继承了表格的功能:

sub func($$) {

}
我更习惯于看到:

sub func {
  ## then extract params using shift for example
}
我查了一下
$
,这是获取当前进程ID的一种方法。但从函数看,这里似乎没有使用进程ID。那么,
$
在这个上下文中是否意味着其他的东西呢

我感到困惑的函数如下所示。为什么使用
($$)

使用文件句柄;
#函数的结构与此非常相似-仅更改名称
子消息($$)
{
我的$string=shift;
我的$fileHandle=shift;
我的$Message=undf;
#parseAMessage和parseBMessage是从文件中提取特定类型消息的函数
if(($Message=parseAMessage($string,$fileHandle))
||($Message=parseBMessage($string,$fileHandle)))
{
}
返回$Message;
}
子语法分析器消息($$)
{
}
子语法分析器消息($$)
{
}
#函数似乎使用参数arg1:file中的字符串,arg2:file的filehandle
#大概这背后的想法是处理文件中的当前行,但也可以访问文件
#在需要时移动到下一行的手柄。所以我称之为这可能不是
#很棒的Perl-我是perler的初学者
$fh=文件句柄->新建;
如果($fh->open(close;
}
打印“完成”\n;
1.

它们是原型,定义函数作为参数的内容(不安全…)

它允许您定义内置函数之类的函数,以便您可以调用
子剂量测量
调用
打印

doSomething($scalar)
doSomething$scalar
将产生相同的结果,如
print($scalar)
print$scalar


根据上面的评论:

print
可能不是一个很好的例子,因为它没有特殊的参数解析,除了不带参数的
print
print$\ucode>一样工作。(如果你真的想为自己的功能实现这一点,你可以用
(@)
)的原型来实现它。像模拟
推送
这样的东西将是一个更有趣的例子(事实上,这就是你链接到的perlsub部分所使用的)。@IlmariKaronen你可能是对的,但这是第一个想到的,不想让map/grep/array函数过于复杂实际上
print
有非常特殊的参数解析,因为
print$fh@list
print{$fh}@list
表单无法用原型模拟@托宾克:不过,那只是。
use FileHandle;

# The structure of function is pretty much like this - names changed only
sub parseMessage($$)
{
  my $string = shift;
  my $fileHandle = shift;

  my $Message = undef;

  # parseAMessage and parseBMessage are functions to extract specific types of messages from file
  if ( ($Message = parseAMessage($string, $fileHandle))
    || ($Message = parseBMessage($string, $fileHandle)) )
  {

  }

  return $Message;
}


sub parseAMessage($$)
{
}

sub parseBMessage($$)
{
}

# The function seems to use arguments arg1: string from file, arg2: filehandle of file
# presumably idea behind this is to process current line in file but also have access to file
# handle to move to next line where required. So the way I am calling this is probably not
# great Perl - I am a beginner perler
$fh = FileHandle->new;
    if ($fh->open("< myfile.log")) {
        # here we evaluate the file handle in a scalar context to get next line
        while($line = <$fh>) {
            parseMessage($line, $fh);   
            #print <$fh>;
        }

        $fh->close;
    }
    print "DONE\n";
1;