我理解在类的"新"方法中使用Perl中的"bless"关键字:
sub new {
my $self = bless { };
return $self;
}
Run Code Online (Sandbox Code Playgroud)
但究竟什么是"祝福"对哈希引用呢?
bless REF,CLASSNAME这个函数告诉引用的东西
REF,它现在
是CLASSNAME包中的一个对象.
有没有办法在没有不必要的复制的情况下获得无结构的结构?
除了双关语之外,我正在尝试import在我的Perl类中实现一个方法来实例化一个Data对象,该对象本质上是一个美化的hashrefs数组,来自一个正确的hashrefs数组.
以下是我计划如何使用它的示例:
# Pull in the data
my $data = Data->import(
[
{ a => 1, b => 7, c => 3},
{ a => 7, b => 9, c => 2},
]
);
$data->manipulate; # Use package methods
Run Code Online (Sandbox Code Playgroud)
我的import实现如下:
package Data;
sub initialize {
my $class = shift;
my $data = [];
bless $data, $class;
return $data;
}
sub import {
my ( $class, $data ) = @_;
bless $data, $class;
return $data; …Run Code Online (Sandbox Code Playgroud) 我希望做一个深刻的(在这一点上,浅薄可能就足够了)一个受祝福的物体的副本.
Foo类
package Foo;
our $FOO = new Foo; # initial run
sub new {
my $class = shift;
my $self = {};
bless $self, $class;
return $self;
}
Run Code Online (Sandbox Code Playgroud)
主要计划
use Foo;
my $copy = $Foo::FOO; # instead of creating a ref, want to deep copy here
$copy->{bar} = 'bar';
Run Code Online (Sandbox Code Playgroud)
bar出现在两者$Foo::FOO和$copy.我意识到我可以通过设置为对象来创建对象的副本$copy = { %{$Foo::FOO} },但随后它将不再受到祝福; 另外,这只适用于简单的数据结构(现在不是问题).是这种方式复制然后保佑(例如$copy = bless { %{$Foo::FOO} }, q{Foo};)的唯一方法吗?
我试图避免使用Moose,Clone或其他非核心模块/软件包,因此在回复时请记住这一点. 粗体所以它更突出:)
我正在研究Compass项目,我的最终css输出很大,所以需要得到祝福.
我正在使用Codekit来编译我的SCSS文件,它有较少和sass文件的祝福选项,但不幸的是这个选项似乎不适用于指南针项目(BTW没有解决方法来修复问题https:// github .com/bdkjones/CodeKit/issues/163)
在编译过程之后是否有另一种方法可以自动执行此操作?是否可以使用nodejs观看css文件然后保佑它?
================================================== ==
UPDATE
我不再使用Codekit了,我使用Grunt来构建项目资产,它就像一个魅力.
我想检查a $thing是否是一个受祝福的对象(例如__PACKAGE__).一个想法是:
use Scalar::Util qw(blessed);
defined blessed $thing && blessed $thing eq __PACKAGE__
Run Code Online (Sandbox Code Playgroud)
是否有更好和/或更优雅的方法,以避免检查是否blessed定义了返回值?
另一种方法是(blessed $thing or '') eq __PACKAGE__,但我不确定包装是否可以合法地为空.
另外,基于Perl Monks,UNIVERSAL::isa($thing, __PACKAGE__)是另一种方式,但这种方法允许更多的东西.
我正在使用双引导系统,并使用以下AppleScript设置启动卷:
tell application "Finder" to if not (disk "SoundHD" exists) then do shell script "diskutil mount " & last word of (do shell script "diskutil list | grep 'Apple_HFS SoundHD'")
do shell script "bless -mount \"/Volumes/SoundHD\" -setBoot --nextonly" with administrator privileges
display notification "Next Boot: SoundHD" with title "Neustart"
Run Code Online (Sandbox Code Playgroud)
由于El Capitan脚本将不再工作,我在脚本编辑器中收到以下错误消息:
tell application "Finder"
exists disk "SoundHD"
--> true
end tell
tell current application
do shell script "bless -mount \"/Volumes/SoundHD\" -setBoot --nextonly" with administrator privileges
--> error "Could not set …Run Code Online (Sandbox Code Playgroud) 来自新手用户的第一篇文章.我谷歌的每一个问题似乎都把我带到了这里,我总能得到一个很好的答案,我正在寻找的东西; 所以当我开始思考Perl中祝福的使用时,这是我的第一站.
我刚刚进入Perl的OOP,就在今天阅读帖子,询问保佑的作用.我现在明白它引用一个标量/散列/数组到一个对象,"附加"它,如果你愿意的话.
在我在Perl中看到的大多数类的例子中,它们似乎没有我以前在其他语言中看到的属性......
{ package Person;
my $property = "This is what I'm talking about :)";
sub new { ... }
...
}
Run Code Online (Sandbox Code Playgroud)
所以,我创建了一个带有属性的愚蠢类,看看会发生什么.我立刻给了物业'NIL'的价值,然后'Not Nil!' 在构造函数中.使用方法LIST,我能够打印属性,正如我所料,它打印出"Not Nil!"
我的问题是,如果属性的工作方式与我预期的相同(在体内声明)那么为什么要使用保佑呢?当你可以简单地创建一个标量/散列/数组作为属性,或者创建你想要作为属性的任何引用时,有什么额外的好处?
我希望我解释了我想要问的内容,非常绿色的Perl :)
在读取下载的Perl模块时,我找到了几种定义输入参数的方法,如下所示.它们之间有什么区别?
sub new{
my $class = shift;
my $self = {@_};
bless{$self, $class};
}
sub count1{
my ($self, $lab1) = @_;
}
sub new1{
my ($class, $lab1) = @_;
my $self = {};
bless $class, $self;
}
sub setpath{
my $self = shift;
}
Run Code Online (Sandbox Code Playgroud) 我是 Perl 的新手,我想了解/了解更多关于 OO 部分的信息。假设我有一个只有属性的“类”;创建包和祝福散列比直接处理散列有什么好处/优势?
为简单起见,让我们考虑以下示例:
package Person;
sub new {
my $class = shift;
my $args = {Name => '', Age => 0, @_};
my $self = { Name => $args->{Name},
Age => $args->{Age}, };
bless $self, $class;
}
package main;
my $person1 = Person->new(Name => 'David', Age => 20);
my $person2 = {Name => 'David', Age => 20, Pet => 'Dog'};
print $person1->{Name} . "\n";
print $person2->{Name} . "\n";
Run Code Online (Sandbox Code Playgroud)
我想知道的是,除了 OO 部分之外,除了 1 是有福散列而 2 是散列引用这一事实之外,$person1and之间有什么区别 …