我是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
的值之外都打印了所有内容。
请澄清$$
实际上意味着什么,以及为什么它不会在我的剧本中返回任何内容。
提前致谢...
答案 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。