在perl中引用标量的用例?

时间:2014-09-09 09:27:09

标签: perl

我正在学习perl引用,我理解对hases或数组的引用的有用性。但是考虑在什么情况下对标量值的引用是有用的。

my $x = 1;
my $sr = \$x;

哪里可以使用$$sr,而不是直接使用$x

例如,当遍历任何深度hashref结构时,如果给定节点是hashref或arrayref,则返回引用不常见但是直接返回标量值而不是返回对标量的引用?

存在一些函数或模块使用或返回对标量的引用,而不是返回标量的值?

5 个答案:

答案 0 :(得分:3)

在子例程中,当您想直接修改传递给它的值时。

e.g。

sub increment_this {
     my ( $inc_ref ) = @_;
     ${$inc_ref}++;
}  

我知道一个微不足道的案例,但也许更相关的是像chomp这样的例子,它从变量或$_中删除尾随字母。

如果您考虑一下 - $_通常是有效的参考。 如果你这样做:

my @array = qw ( 1 2 3 );
foreach ( @array ) {
    $_++;
}

print @array; 

修改$_已修改数组的内容。

答案 1 :(得分:3)

我认为真正的答案在于你自己的问题:对标量的引用并不是非常有用,你可以在编写代码时忽略它们的存在。主要用途as hinted at by perreal是您可以指向相同的内存位置:在对象之间共享变量。

然而,出于好奇心和学术目的,除了perreal和Sobrique留下的好例子之外,还会想到一个相当模糊的东西。您可以打开文件句柄以打印到变量:

use strict;
use warnings;
use Data::Dumper;

my $string;
open my $fh, ">", \$string or die $!;
print $fh "Inside the string";

print Dumper $string;
# prints $VAR1 = 'Inside the string';

答案 2 :(得分:2)

如果要在对象之间共享标量:

my $v = 1;
my %h1 = (a=>\$v);
my %h2 = (b=>\$v);   
$v++;
print ${$h1{a}}, "\n";
print ${$h2{b}}, "\n";

打印:

2
2

答案 3 :(得分:1)

当你必须将大字符串传递给sub时,它不是很有用,并且不想复制它们以加快速度并且不浪费内存:

sub my_sub {
    my $str = shift;  #makes a copy of a reference => cheaper
    #do something with $$str
}

#...
$x = ' ... large string ...';
my_sub(\$x);

答案 4 :(得分:0)

@TLP提到了文件句柄,这引发了另一个例子:

传递文件句柄。操作文件的好习惯是使用词法文件句柄,以避免命名空间污染。

sub write_header {
  my ( $fh_ref ) = @_;
  print ${$fh_ref} "This is a header\n"; 
}

open ( my $output, ">", "output_filename" );
write_header ( \$output );
write_content ( \$output );
write_footer ( \$output );
close ( $output );