chomp如何能够改变未通过引用传递的变量的值?

n.r*_*.r. 5 perl

chomp似乎能够改变未通过引用传递的变量的值; 也就是说,语法chomp $var代替chomp \$var.

这怎么可能?我怎样才能在函数中模仿这种行为?

chomp:

my $var="foo\n";
chomp $var;
print $var
Run Code Online (Sandbox Code Playgroud)

mychomp:

my $var="foo\n";
mychomp(\$var);
print $var;

sub mychomp {
  my $ref=shift;
  $$ref=~s/\s+$//;
}
Run Code Online (Sandbox Code Playgroud)

Bor*_*din 14

所有Perl参数都是"通过引用传递"; 更准确地说,内容@_是实际参数的别名

use strict;
use warnings;
use 5.010;

my $s = 'abc';

upper_case($s);

say $s;


sub upper_case {
  $_[0] =~ tr/a-z/A-Z/;
}
Run Code Online (Sandbox Code Playgroud)

产量

ABC
Run Code Online (Sandbox Code Playgroud)

请注意,使用数据文字调用此函数,例如

upper_case('def')
Run Code Online (Sandbox Code Playgroud)

会产生致命错误

Modification of a read-only value attempted
Run Code Online (Sandbox Code Playgroud)

  • 或者,因为用户询问`chomp`,`sub mychomp {$ _ [0] = ~s /\s +\z //; }`.或者更准确地说,`sub mychomp {my $ c = 0; for(@_){$ c + = length($ /)if s {\ Q $ /\E\z} {}; } $ c}` (3认同)
  • 我推荐使用`sub convert_to_uppercase {for(@_){$ _ = uc}}`,因为无论有多少参数或者它们是旧ASCII还是现代Unicode文本都可以.我猜想有些人会写@ $ _ = uc for @ _`. (2认同)