如何正确地将变量传递给调用函数?

时间:2019-04-02 07:22:40

标签: perl reference

我实现了一个称为cell的类,并尝试将char存储到其中。 我发现用我的setter和getter来检索char是一个问题。

#This is the detail of the class:      
package Cell;
sub new{
  my $class = shift;
  my $self = {  
    content => -1,
  };
  return bless $self, $class;
}

#This is my setter and getter  
sub setContent{
  my ($self,$ch) = @_;
  $self->{content} = $ch;
  print("stored char".$self->{content}."\n");
} 

sub getContent{
  my $self = @_;
  print("passing back char".$self->{content}."\n");
  return $self->{content};  
} 

# this is the way i used the class
my $ch = "a";
my $cell = Cell->new();
$cell->setContent($ch);     
my $testvar = $cell->getContent();
print("test start\n".$testvar);
print("test end\n");
#

我发现我可以将char传递给setter,并且应该将其存储在$ self-> {content}中,但是当尝试使用getter检索char时,$ self-> {content}变为空

1 个答案:

答案 0 :(得分:3)

一个直接错误是您的“ getter” getContent方法中的行:

my $self = @_;  # assigns number of elements in the array to $self!

这试图将一个数组分配给一个标量,这是没有意义的。相反,要做的是对数组求值到其元素数,并将那个分配给$self。因此,在该方法的其余部分中,$self中没有对象,只有一个数字,这里是1

如果您通过程序顶部的use warnings;启用了warnings,则会收到

  

在...处使用“严格引用”时,不能将字符串(“ 1”)用作HASH引用。

尝试在$self上调用方法的行,告诉您期望的对象(hashref)实际上是一个字符串。这样可以为您提供准确的行号和内容丰富的diagnostic message。如果未启用警告,则代码会悄悄进行,但无法按预期进行。

道德:请始终以use warnings(和use strict)开头

解决方法是使其成为“列表分配”-在列表“ context”中分配

my ($self) = @_;

其中,列表上下文由左侧的=施加在赋值运算符(...)上。现在,将数组@_中的元素一对一地分配给()中列出的变量。 LHS上只有一个变量($self),因此@_的第一个元素被分配给它,其余的(如果有的话)被丢弃。

或者,在标量分配中将@_的单个元素分配给$self。 在面向对象的代码中,通常使用shift完成此操作,因此也可以从参数列表中删除该对象,以方便以后使用

my $self = shift;

默认情况下,子例程中的shift适用于@_

请参见contextScalar vs List Assignment Operator

我建议始终将class写入其自己的.pm文件中,然后将其use保存在程序中。有关程序包中的错误处理,请参见Carp