我不明白Perl read($ buf)函数如何能够修改$ buf变量的内容.$ buf不是引用,因此参数由copy(来自我的c/c ++知识)给出.那么为什么在调用者中修改$ buf变量呢?
它是一个平局变量还是什么?关于setbuf的C文档对我来说也是非常难以理解的
# Example 1
$buf=''; # It is a scalar, not a ref
$bytes = $fh->read($buf);
print $buf; # $buf was modified, what is the magic ?
# Example 2
sub read_it {
my $buf = shift;
return $fh->read($buf);
}
my $buf;
$bytes = read_it($buf);
print $buf; # As expected, this scope $buf was not modified
Run Code Online (Sandbox Code Playgroud) 有人能告诉我为什么main在这个非常小而简单的例子中找不到Class :: Accessor生成的方法吗?
这几行代码失败了
perl codesnippets/accessor.pl
Can't locate object method "color" via package "Critter" at
codesnippets/accessor.pl line 6.
Run Code Online (Sandbox Code Playgroud)
看代码:
#!/opt/local/bin/perl
# The whole Class::Accessor thing does not work !!
my $a = Critter->new;
$a->color("blue");
$a->display;
exit 0;
package Critter;
use base qw(Class::Accessor );
Critter->mk_accessors ("color" );
sub display {
my $self = shift;
print "i am a $self->color " . ref($self) . ", whatever this word means\n";
}
Run Code Online (Sandbox Code Playgroud) 我想创建一个泛型类,其构建器不会返回此泛型类的实例,而是返回专用子类的实例.
当Moose进行自动对象构建时,我无法理解这是否可能,以及如何使用Moose语法创建一个Moose类并具有此行为.
例如:用户询问:$file = Repository->new(uri=>'sftp://blabla')....并返回一个`Repository :: _ Sftp``实例
用户将使用$file好像它是一个Repository实例,而不需要知道真正的子类(多态)
注意:
根据要求,也许我应该更清楚我想要实现
的目标:我的类的目的是能够通过简单地创建一个"隐藏的"存储库来添加新的存储库方案(例如,通过sftp) _Stfp类,并在Repository构造函数中添加一个case来根据url生成正确的专用对象.存储库就像一个虚拟基类,提供专用对象实现的接口.
所有这些都是为了添加新的存储库方案而不需要修改程序的其余部分:它会在不知不觉中处理专用实例,就像它是一个Repository实例一样.
我的Linux平台上有perl64位重新编译和SSHing Mac终端(我想是UTF-8).我提供所有这些信息,以防它可能是相关的.
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@vi\n") ."\n");'
756e98065cb8cbf603a3dbef2afe9261
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@visi\n") ."\n");'
756e98065cb8cbf603a3dbef2afe9261
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@vision\n") ."\n");'
756e98065cb8cbf603a3dbef2afe9261
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@visionten\n") ."\n");'
756e98065cb8cbf603a3dbef2afe9261
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@visionten.\n") ."\n");'
d32e04de6906b3f284c6834b4d1d77c1
# perl -e 'use Digest::MD5 qw/md5_hex/; print(md5_hex("alex@\n") ."\n");'
264eca1047ccc6272ac2e338c695379e