在这个早期的Stackoverflow问题中,特别是brian d foy的"脚本如何成为一个模块"我已经阅读了如何设置代码,以便它可以作为脚本或模块运行,使用这种技术:
package SomeModule;
__PACKAGE__->run(@ARGV) unless caller();
sub run {
# Do stuff here if you are running the file as
# a script rather than a module.
}
Run Code Online (Sandbox Code Playgroud)
__PACKAGE__这个设置的目的是什么?为什么不这样做呢?
run(@ARGV) unless caller();
Run Code Online (Sandbox Code Playgroud) ref()的文档提到了几个可能的返回值.我明白了其中大部分,但不是REF,IO和LVALUE.我如何编写Perl代码ref以返回这些值?
在阅读了关于typeglobs和文件句柄的文档后,我接近了IO这段代码:
open(INPUT, '<', 'foo.pl');
print ref(*INPUT{IO}), "\n"; # Prints IO::Handle
Run Code Online (Sandbox Code Playgroud)
因为REF和LVALUE我尝试了几个奇怪的结构,但没有成功.
我在使用Spreadsheet :: WriteExcel和公式方面遇到了困难VLOOKUP.以下测试脚本使用一些数据填充工作表并尝试创建VLOOKUP公式.当我打开生成的Excel文件时,公式结果显示为#VALUE!.如果我手动编辑任何包含公式的单元格(按F2然后只输入ENTER而不更改任何内容),我可以让Excel正确评估公式.知道出了什么问题吗?
对于它的价值,如果我在OpenOffice中打开相同的文件,公式工作正常.
use strict;
use warnings;
use Spreadsheet::WriteExcel;
my $wb = Spreadsheet::WriteExcel->new('foo.xls');
my $ws = $wb->add_worksheet;
for my $r (0 .. 9){
for my $c (0 .. 4){
$ws->write($r, $c, $r * 10 + $c);
}
$ws->write($r, 10, $r * 10);
my $formula = sprintf('=VLOOKUP(K%s, A1:B10, 2, FALSE)', $r + 1);
$ws->write( $r, 11, $formula );
# $ws->write_formula( $r, 11, $formula ); # Does not help either.
}
Run Code Online (Sandbox Code Playgroud)
版本信息:
做以下事情的"红宝石"方式是什么?我仍然在考虑更多命令式的风格编程,而不是真正适应红宝石的思考.我想要做的是找到与数组平均值最接近的元素,例如,考虑以下数组
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
平均值是2.0.我想写的方法返回最接近平均值的元素,在这种情况下是1和3.
另一个例子将更好地说明这一点
[10,20,50,33,22] avg is 27.0 method would return 22 and 33.
Run Code Online (Sandbox Code Playgroud) 以下代码定义了两个类(DeckA和DeckB),它们的区别仅在于它们是否使用MooseX :: AttributeHelpers附带的功能.Moose生成的吸气剂DeckB不是我的预期.这是一个错误还是我误解了MooseX :: AttributeHelpers和MooseX :: FollowPBP应该如何互动?
我现在的解决方法是避免is在这种情况下使用参数,而是声明a reader并writer根据需要.
use strict;
use warnings;
my %moose_args = (
isa => 'ArrayRef[Str]',
is => 'ro',
default => sub {[]},
);
my %moose_attr_helper_args = (
metaclass => 'Collection::Array',
provides => {
elements => 'get_all_cards',
},
);
package DeckA;
use Moose;
use MooseX::FollowPBP;
use MooseX::AttributeHelpers;
has 'cards' => (%moose_args);
package DeckB;
use Moose;
use MooseX::FollowPBP;
use MooseX::AttributeHelpers; …Run Code Online (Sandbox Code Playgroud) % %p = ('option1' => 'Option 1',
% 'option2' => 'Option 2',
% 'option3' => 'Option 3'
% );
<select name="killer_feature" id="killer_feature" class="select">
% foreach (keys %p) {
% my $selected = param('killer_feature') && param('killer_feature') eq $_ ? 'selected="selected"' : '';
% if (!param('killer_feature') && $_ eq 'option2') { $selected = 'selected="selected"' }
<option value=" <%=$_%>" <%= $selected %>>
<%= $p{$_} %>
</option>
% }
</select>
Run Code Online (Sandbox Code Playgroud)
上面的代码通过返回'内部服务器错误'来破坏应用程序,但是如果我轻松编辑第一行% my %p(我试过它,因为其他一些控件都有这种格式)它可以工作,我想知道两者之间的区别.
它是一个基于Mojolicious Web框架的perl应用程序.
非常感谢!
这段代码的复杂性是什么?
foreach $var (keys %varset) {
print "${var}\n";
}
Run Code Online (Sandbox Code Playgroud)
是O(n ^ 2)还是O(n),也就是说,每次迭代还是只调用一次键操作?
在一个快速而肮脏的Perl脚本中,我有一个这样的数据结构:
$tax_revenue{YEAR}{STATE}{GOVLEV}{TAX} = integer
Run Code Online (Sandbox Code Playgroud)
哈希键假设这样的值:
YEAR: 1900 .. 2000
STATE: AK, AL, ... WY
GOVLEV: state, local
TAX: type of tax (income, sales, etc.)
Run Code Online (Sandbox Code Playgroud)
此外,散列键是唯一的.例如,TAX参数的值不会与另一个其他参数的值冲突.
我正在开始使用这些数据的中型项目,我想以更灵活的方式实现数据结构.我不知道我还需要的所有数据检索功能,但这里有一些例子:
# Specify the parameters in any order.
Tax_rev( qw(1902 WY state property) );
Tax_rev( qw(state property 1902 WY) );
# Use named parameters.
Tax_rev(year => 1902, state => 'WY', govlev => 'state', tax => 'property');
# Use wildcards to obtain a list of values.
# For example, state property tax revenue in …Run Code Online (Sandbox Code Playgroud) perlre中/m选项的文档说明了这一点:
将字符串视为多行.也就是说,更改"^"和"$"以匹配字符串的开头或结尾,以匹配字符串中任何位置的任何行的开头或结尾.
但是这个例子似乎表明了这一点/^/并且/^/m行为方式相同.我有什么误会?
use strict;
no warnings; # Ignore warning about implicit split to @_
my $x = " \n \n ";
print scalar(split /^/m, $x), scalar(split /$/m, $x), "\n"; # 33
print scalar(split /^/, $x), scalar(split /$/, $x), "\n"; # 31
Run Code Online (Sandbox Code Playgroud) 我有一条线:
$myline = 'ca,cb,cc,cd,ce';
Run Code Online (Sandbox Code Playgroud)
我需要将ca匹配到$ 1,将cb匹配到$ 2等等.
不幸
$myline =~ /(?:(\w+),?)+/;
Run Code Online (Sandbox Code Playgroud)
不起作用.使用pcretest,它只将'ce'与$ 1 匹配.怎么做对了?我是否需要将其置于while循环中?
谢谢!