我想在Moose中声明一个只读属性,在调用new时无法初始化.在声明以下内容之后:
package SOD::KuuAnalyze::ProdId;
use Moose;
has 'users' => (isa => 'ArrayRef[Str]', is => "ro");
1;
Run Code Online (Sandbox Code Playgroud)
我不希望以下工作:
my $prodid = SOD::KuuAnalyze::ProdId->new(users => ["one", "two"]);
Run Code Online (Sandbox Code Playgroud) 为什么打印42:
$answer = 42;
$variable = "answer";
print ${$variable} . "\n";
Run Code Online (Sandbox Code Playgroud)
但这不是:
my $answer = 42;
my $variable = "answer";
print ${$variable} . "\n";
Run Code Online (Sandbox Code Playgroud) 如果我有一个打开文件的子程序,那么只有在第一次调用subrountine时才能确保它打开它的最佳方法是什么?我有这个但不确定它是否是最佳实践:
{
my $count = 0;
sub log_msg {
my ($msg,$name) = @_;
if ($count == 0) {
my $log_file_name = "/tmp/" . $name;
open my $log_fh,">",$log_file_name or croak "couldn't open $log_file_name : $!";
print $log_fh "$timestamp: created and opened $log_file_name\n";
}
$count++;
}
}
Run Code Online (Sandbox Code Playgroud) 此代码适用于irb:
irb(main):037:0> eval <<-EOS
irb(main):038:0" #{attribute} = "host"
irb(main):039:0" puts machine
irb(main):040:0" EOS
host
=> nil
irb(main):041:0> puts machine
host
=> nil
irb(main):042:0> puts attribute
machine
=> nil
irb(main):043:0>
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试执行与ruby脚本相同的代码时,我收到以下错误:
../autosys/convert_jil_to_zapp.rb:40: undefined local variable or method `machine' for main:Object (NameError)
from ../autosys/convert_jil_to_zapp.rb:29:in `each_line'
from ../autosys/convert_jil_to_zapp.rb:29
from ../autosys/convert_jil_to_zapp.rb:27:in `each'
from ../autosys/convert_jil_to_zapp.rb:27
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 77$ gvim try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 78$ chmod +x try.rb
pi929c1n10 /ms/user/h/hirscst/ruby/autosys 79$ ./try.rb
host
./try.rb:8: undefined local variable or method `machine' for main:Object (NameError)
Run Code Online (Sandbox Code Playgroud)
有谁能解释为什么?
好吧,我刚刚花了4个小时试图找出这个没有成功.我已经尝试了所有常见的嫌疑人,并搜索了ruby 1.9.1,加载路径,宝石,mac os x,freebsd,prawn等内容的每个组合.底线是这个:
当我从mac os x 10.5上的源代码编译ruby1.9.1-p129时,我得到的默认加载路径($ :)是:
ruby -e "puts $:" /usr/local/lib/ruby/gems /usr/local/lib/ruby/site_ruby/1.9.1 /usr/local/lib/ruby/site_ruby/1.9.1/i386-darwin9.7.0 /usr/local/lib/ruby/site_ruby /usr/local/lib/ruby/vendor_ruby/1.9.1 /usr/local/lib/ruby/vendor_ruby/1.9.1/i386-darwin9.7.0 /usr/local/lib/ruby/vendor_ruby /usr/local/lib/ruby/1.9.1 /usr/local/lib/ruby/1.9.1/i386-darwin9.7.0 .
例如,当我安装prawn gem时,我得到:
gem which prawn (checking gem prawn-0.5.0.1 for prawn) /prawn.rb
当我试图要求它时,我得到:
ruby -e "require 'prawn'"
-e:1:in `require': no such file to load -- prawn (LoadError)
from -e:1:in `'
我能够解决这个问题的唯一方法是做一些像这样的傻事:
$: << "/usr/local/lib/ruby/gems/1.9.1/gems/prawn-0.5.0.1/lib"
Run Code Online (Sandbox Code Playgroud)
当然,这完全是荒谬的.所以问题是如何让ruby 1.9.1识别并遵循正确的宝石路径?我从来没有遇到1.8.7这个问题,所以我假设它具体为1.9.1.我觉得我错过了一些完全明显的东西,任何帮助都会非常感激!
所以我遵循了这个主题中的每一个建议
没有成功.我正在运行os x 10.6,rails 2.3.3,ruby 1.9.1,当我尝试访问我的rails应用程序的首页时仍然出现此错误:
未初始化的常量SQLite3 :: Driver :: Native :: Driver :: API
我用Google搜索了所有可能的雪豹,铁轨,sqlite3组合,没有任何运气.希望有人可以提供帮助.谢谢!
有没有人有同时使用多种语言的技巧?我每天都使用objective-c,c,perl,ruby,bash,ksh,rails和其他专有语言,并且发现每天在它们之间来回传递越来越困难.作为在perl和ruby之间切换的一个简单示例,我经常忘记在perl中使用分号,并发现自己使用$用于ruby中的本地变量.从objective-c到c,情况更糟:我在objective-c中使用函数调用(而不是meesage调用).是否有人提出使用多种语言提高工作效率的技巧?
对于那些建议将IDE作为解决方案的人,虽然我原则上同意使用IDE来提高生产力.我倾向于在vi中完成所有编码
我一直在尝试找到一个Perl模块,它将YAML文件转换为moose对象,而不必像使用MooseX :: YAML时那样预先声明结构.有谁知道这样的模块(或脚本)?
以下代码直接从Tie :: File模块的源代码中提取.在这种情况下,O_ACCMODE定义中空括号的作用是什么?我知道使用了什么子程序原型,但这种用法似乎与此无关.
use Fcntl 'O_CREAT', 'O_RDWR', 'LOCK_EX', 'LOCK_SH', 'O_WRONLY', 'O_RDONLY';
sub O_ACCMODE () { O_RDONLY | O_RDWR | O_WRONLY }
Run Code Online (Sandbox Code Playgroud) 所以我上了Core 2 Duo MacBook上运行的Perl 5.10亲们编译线程支持:usethreads=define,useithreads=define.我有一个简单的脚本来读取4个gzip文件,每个文件包含750000行.我正在使用Compress :: Zlib来解压缩和读取文件.我有两个实现,它们之间的唯一区别是一个包含use threads.除此之外,两个脚本都运行相同的子程序来进行读取.因此,在伪代码中,非线程程序执行此操作:
read_gzipped(file1);
read_gzipped(file2);
read_gzipped(file3);
read_gzipped(file4);
Run Code Online (Sandbox Code Playgroud)
线程版本如下:
my thr0 = threads->new(\$read_gzipped,'file1')
my thr1 = threads->new(\$read_gzipped,'file1')
my thr2 = threads->new(\$read_gzipped,'file1')
my thr3 = threads->new(\$read_gzipped,'file1')
thr0->join()
thr1->join()
thr2->join()
thr3->join()
Run Code Online (Sandbox Code Playgroud)
现在,线程版本的运行速度几乎比非线程脚本快2倍.这显然不是我希望的结果.谁能解释我在这里做错了什么?
perl ×6
ruby ×3
moose ×2
subroutine ×2
attributes ×1
cpan ×1
definition ×1
eval ×1
file ×1
lexical ×1
new-operator ×1
performance ×1
prawn ×1
prototype ×1
rubygems ×1
sqlite ×1
variables ×1
yaml ×1