小编enn*_*ler的帖子

如何防止在调用new时设置Perl Moose只读属性?

我想在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)

perl attributes moose new-operator

6
推荐指数
2
解决办法
886
查看次数

为什么我不能使用Perl变量的值来访问词法变量名?

为什么打印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)

variables perl metaprogramming lexical

6
推荐指数
4
解决办法
903
查看次数

如何在Perl中打开文件时才打开文件?

如果我有一个打开文件的子程序,那么只有在第一次调用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)

perl file subroutine

5
推荐指数
1
解决办法
261
查看次数

Ruby eval在irb中与文件中的行为不同

此代码适用于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)

有谁能解释为什么?

ruby eval

4
推荐指数
1
解决办法
1463
查看次数

Ruby 1.9.1加载路径疯狂

好吧,我刚刚花了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.我觉得我错过了一些完全明显的东西,任何帮助都会非常感激!

ruby rubygems prawn

4
推荐指数
1
解决办法
6704
查看次数

雪豹,sqlite3-ruby

所以我遵循了这个主题中的每一个建议

没有成功.我正在运行os x 10.6,rails 2.3.3,ruby 1.9.1,当我尝试访问我的rails应用程序的首页时仍然出现此错误:

未初始化的常量SQLite3 :: Driver :: Native :: Driver :: API

我用Google搜索了所有可能的雪豹,铁轨,sqlite3组合,没有任何运气.希望有人可以提供帮助.谢谢!

ruby sqlite ruby-on-rails osx-snow-leopard

4
推荐指数
1
解决办法
4382
查看次数

一次开发多种语言的提示

有没有人有同时使用多种语言的技巧?我每天都使用objective-c,c,perl,ruby,bash,ksh,rails和其他专有语言,并且发现每天在它们之间来回传递越来越困难.作为在perl和ruby之间切换的一个简单示例,我经常忘记在perl中使用分号,并发现自己使用$用于ruby中的本地变量.从objective-c到c,情况更糟:我在objective-c中使用函数调用(而不是meesage调用).是否有人提出使用多种语言提高工作效率的技巧?

对于那些建议将IDE作为解决方案的人,虽然我原则上同意使用IDE来提高生产力.我倾向于在vi中完成所有编码

programming-languages

4
推荐指数
1
解决办法
310
查看次数

是否有一个Perl模块用于在运行时动态地将YAML文件转换为Moose对象?

我一直在尝试找到一个Perl模块,它将YAML文件转换为moose对象,而不必像使用MooseX :: YAML时那样预先声明结构.有谁知道这样的模块(或脚本)?

perl yaml cpan moose

4
推荐指数
1
解决办法
536
查看次数

()在Perl的子例程定义中完成了什么?

以下代码直接从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)

perl prototype definition subroutine

4
推荐指数
3
解决办法
213
查看次数

当我使用线程时,为什么我的Perl脚本会慢速解压缩文件?

所以我上了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 performance multithreading

3
推荐指数
2
解决办法
329
查看次数