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}时仍然指向非截断值.难道我做错了什么?
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)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |