perl中的$$实际上会返回什么?

时间:2015-03-09 06:16:20

标签: perl

我是Perl的新手,从一开始就学习。我已经读过$$返回

  

运行此脚本的Perl进程的pid。

根据以下链接,

http://www.tutorialspoint.com/perl/perl_special_variables.htm

我有以下在Windows机器上执行的Perl脚本,

sub test
{
    my ($surrogate_name) = @_;
    if((defined $surrogate_name) && ($surrogate_name == 1))
    {
        print "Done!"."\n";
    }
    return $surrogate_name;
}

sub t
{
    my ($surrogate_name) = @_;
    my $record;
    my $surrogate_value;
    $record = &test($surrogate_name);
    print $record."\n";
    if ($record)
    {
        print "B"."\n";
        $surrogate_value = $$record{$surrogate_name};
    }
    print $surrogate_value."\n";
    print "A"."\n";
    return $surrogate_value;
}

&t(1);

在这段代码中,我观察到除了$surrogate_value的值之外都打印了所有内容。

请澄清$$实际上意味着什么,以及为什么它不会在我的剧本中返回任何内容。

提前致谢...

3 个答案:

答案 0 :(得分:8)

$$返回当前正在运行的脚本的进程ID。

但在您的情况$surrogate_value = $$record{$surrogate_name}中,这是一个完全不同的概念,即解除引用。

例如$$与变量名一起使用以取消引用它。

my $a = 10; #declaring and initializing a variable.
my $b = \$a; #taking scalar value reference
print $$b;  #now we are dereferencing it using $$ since it is scalar reference it will print 10

my %hashNew = ("1" => "USA", "2" => "INDIA"); #declaring a hash
my $ref = \%hashNew; #taking reference to hash
print $$ref{2}; #this will print INDIA we derefer to hash here

为了更好地理解perl中的读取引用和解除引用。

答案 1 :(得分:1)

正如您所写,变量$$是当前流程的PID:

print $$ . "\n";

您在脚本中编写的内容是$$record{$surrogate_name},这意味着访问哈希元素并等同于$record->{$surrogate_name}

除此之外,$$name通常意味着取消引用对标量的引用。例如,如果您有:

my $x = 1;    # Scalar
my $y = \$x;  # Scalar, value of which is a reference to another scalar (address)
my $z = $$y;  # Dereference the reference, obtaining value of $x

这相当于对C中指针的操作:

int  x = 1;
int *y = &x;
int  z = *y;

详细了解here

答案 2 :(得分:1)

通常,$$用于打印当前进程ID。

print $$;

但$还有另一项工作,用于取消引用标量变量。 例如:

use strict;
use warnings;

my $Input = 5;
my $Input_Refer = \$Input;
print "$Input\n";
print $$Input_Refer;

在上面的例子中,我们有两个标量变量, 1. $Input,其中包含5作为值。 2. $Input_Refer,其中包含$ Input变量的引用作为值。 所以,如果我们打印$Input,它会将值设为5, 如果我们打印$Input_Refer,它将打印$ Input的内存地址。 因此我们必须取消引用它,因为我们必须使用另一个这样的$,

print $$Input_Refer;

它将输出为5。