如何通过perl中的引用传递哈希值

0 variables perl hash reference subroutine

我有以下代码,我写截断大值.

   sub truncate_large_email_tag
    {
      my($email_tag) = @_;
      my $size = length($email_tag);

    if ($size>5000) { 
        my $fragment = substr($email_tag,0,5000);
        $email_tag = $fragment;
        #log_it( "\n\Truncated Large Email tags\n\n") if $TRACE;
        }
Run Code Online (Sandbox Code Playgroud)

我在另一个子程序中使用调用来调用此子例程

  sub do_something
   {
  #some code here # CFG_PASS is a hash

        $EMAIL{$tag}=$CFG_PASS{$typ}{$tag}{$where . '_DEFAULTS'}; #Email        
        #tag initialized here
        truncate_large_email_tag($EMAIL{$tag});
        }
Run Code Online (Sandbox Code Playgroud)

但是当我检查$ EMAIL {$ tag}时仍然指向非截断值.难道我做错了什么?

ike*_*ami 6

Perl总是通过引用传递.问题是你没有修改参数,而是修改了你在函数中创建并复制参数(my ($email_tag) = @_;)的变量.

更改

my $fragment = substr($email_tag, 0, 5000);
$email_tag = $fragment;
Run Code Online (Sandbox Code Playgroud)

my $fragment = substr($email_tag, 0, 5000);
$_[0] = $fragment;
Run Code Online (Sandbox Code Playgroud)

要么

$_[0] = substr($email_tag, 0, 5000);
Run Code Online (Sandbox Code Playgroud)

要么

$_[0] = substr($_[0], 0, 5000);
Run Code Online (Sandbox Code Playgroud)

要么

substr($_[0], 5000) = '';
Run Code Online (Sandbox Code Playgroud)

所以你最终得到了

sub truncate_inplace {
    substr($_[0], $_[1]) = ''
        if length($_[0]) > $_[1];
}

truncate_inplace($EMAIL{$tag}, 5000);
Run Code Online (Sandbox Code Playgroud)

但为什么不只是使用

sub truncate {
    my ($s, $max_len) = @_
    return length($s) > $max_len ? substr($s, 0, $max_len) : $s;
}

$EMAIL{$tag} = truncate($EMAIL{$tag}, 5000);
Run Code Online (Sandbox Code Playgroud)