我只花了一个划时代搞清楚,我的大整数是个好人,是printf的%d/ %u不可达显示它的任务:
use strict;
use warnings;
use bigint;
use List::Gen;
*factorial = do {use bigint; <[..*] 1, 1..>->code};
my $value = factorial(32);
printf "%d\n", $value; # -1
printf "%u\n", $value; # 18446744073709551615
printf "%s\n", $value; # 263130836933693530167218012160000000
Run Code Online (Sandbox Code Playgroud)
如果答案是否定的话,我不会感到惊讶,只是想确认一下.
sub reduce(&@) {
my $expr = \&{shift @ARG};
my $result = shift @ARG;
while (scalar @ARG > 0) {
our $a = $result;
our $b = shift @ARG;
$result = $expr->();
}
return $result;
}
Run Code Online (Sandbox Code Playgroud)
我无法真正理解这段代码中的一些语法.有人可以向我解释一下吗?喜欢\&和$result = $expr->()
我是Perl-OO初学者,我遇到了设计挑战.我希望你能给我一些提示,以获得一个优雅的解决方案.我在这里使用鼠标对象系统.
举个简单的例子,假设我有一个User-Object.用户有一个名字.
package User;
use Mouse;
has "name" => (
is => "rw",
isa => "Str|Undef",
);
Run Code Online (Sandbox Code Playgroud)
然后我有一个User-Cache-Object,它获取所有用户的列表(来自LDAP服务器).您可以说这是用户缓存和用户之间的"有一个"关系.
package UserCache;
use Mouse;
has "users" => (
is => 'rw',
isa => 'ArrayRef|Undef',
default => sub { [] },
);
Run Code Online (Sandbox Code Playgroud)
我将此用户列表存储为用户缓存的访问者中的用户对象数组.
my $cache = UserCache->new();
foreach my $entry ( $ldap->searchGetEntries() ) {
my $user = User->new();
$user->name($entry->get_value('userdn'));
push @{ $cache->users }, $user;
}
Run Code Online (Sandbox Code Playgroud)
现在这就是我的问题所在.如果我想找到具有特定属性的用户对象(例如,名为John的用户),我必须遍历整个用户对象数组并查询每个对象的名称.当给出名称列表时,这会得到一个非常低效的过程.
foreach my $user ( @{ $cache->users } ) {
if ( $user->name eq 'John' ) {
#do …Run Code Online (Sandbox Code Playgroud) 我在Perl中有一个字符串:'CCCCCCCC^hC^iC^*C^"C^8A'.
我想使用正则表达式拆分此字符串:"^[any_character]C".换句话说,我想用实际字符分隔它^,然后是任何字符,后跟一个特定的字母(在这种情况下C,但它可以是A,或任何其他字符).
我试过看其他问题/帖子,最后提出了我的问题@split_str = split(/\^(\.)C/, $letters),但这似乎没有用.
我确定我做错了什么,但我不知道是什么.
我正在尝试使用模块中的is_dst()方法DateTime来确定是否正在进行夏令时转换.
我开始写一个非常基本的例子,我确信它会起作用,但出于某种原因,我得到了意想不到的结果.
例:
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my $dt1 = DateTime->new(
'year' => 2015,
'month' => 3 ,
'day' => 8 ,
'hour' => 3 ,
);
my $dt2 = DateTime->new(
'year' => 2015,
'month' => 3 ,
'day' => 7 ,
'hour' => 3 ,
);
print $dt1."\n";
print $dt2."\n";
print $dt1->is_dst()."\n";
print $dt2->is_dst()."\n";
Run Code Online (Sandbox Code Playgroud)
我开始的日期是我知道的夏令时过渡期:2015年3月8日星期日.我之所以选择凌晨3点,是因为我知道在那个时间点已经发生了夏令时过渡.
然后我在夏令时过渡之前就知道了一个日期:2015年3月7日星期六也是凌晨3点.
然后我打印两个日期及其相应的DST标志.
输出:
2015-03-08T03:00:00
2015-03-07T03:00:00
0
0 …Run Code Online (Sandbox Code Playgroud) 我正在努力HTML::TokeParser
解析包含日文字符的HTML文档.
这是我的代码:
use utf8;
use Encode qw(decode encode is_utf8);
use Encode::Guess;
use Data::Dumper;
use LWP::UserAgent;
use HTTP::Cookies;
use Cwd;
use HTML::TokeParser;
my $local_dir = getcwd;
my $browser = LWP::UserAgent->new();
my $cookie_jar = HTTP::Cookies->new(
file => $local_dir . "/cookies.lwp",
autosave => 1,
);
$browser->cookie_jar( $cookie_jar );
push @{ $browser->requests_redirectable }, 'POST';
$browser->requests_redirectable;
my $response = $browser->get("http://www.yahoo.co.jp/");
my $html = $response->content;
print $html;
utf8::decode($html);
my $p = HTML::TokeParser->new( \$html );
# dispatch table with subs to handle the different types …Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个计算数字阶乘的程序.我对perl不是很熟悉,所以我觉得我缺少一些语法规则.
当我输入5时,程序应返回120.相反,它返回几十个1.当我尝试其他数字时,我仍然得到1,但更多或更少取决于我是否输入更高或更低的数字.
这是我的代码:
print"enter a positive # more than 0: \n";
$num = <STDIN>;
$fact = 1;
while($num>1)
(
$fact = $fact x $num;
$num = $num - 1;
)
print $fact;
system("pause");
Run Code Online (Sandbox Code Playgroud)
这是我第一篇关于Overflow的帖子,所以我希望我遵守所有这些规则.
我正在尝试理解perldsc文档中的"常见错误"部分.当他提到时,作者试图传达的是什么:
构造像数组数组之类的两个最常见的错误是意外地计算元素的数量,或者重复引用相同的内存位置.在这种情况下,您只需获取计数而不是嵌套数组:
for my $i (1..10) {
my @array = somefunc($i);
$AoA[$i] = @array; # WRONG!
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当它迭代时,它将取第一个值(1..10),即1,并将它传递给这样的函数:
my @array = somefunc(1);
Run Code Online (Sandbox Code Playgroud)
由于没有定义该函数,我将创建逻辑.
sub somefunc {
my $a = shift;
print $a * $a;
}
Run Code Online (Sandbox Code Playgroud)
这基本上会这样做:
1 * 1
Run Code Online (Sandbox Code Playgroud)
结果是'1'.
根据我的理解,我的@array看起来像:
@array = ('1');
Run Code Online (Sandbox Code Playgroud)
下一行将做:
$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)
我假设$ AoA [$ 1]是一个匿名数组(他/她没有用'my',btw声明)而@array将是这个匿名数组的第一个元素,作者说它'错了.并为每个循环迭代到'2'.
somefunc(2);
Run Code Online (Sandbox Code Playgroud)
这将是'4'并传递给:
$AoA[$i] = @array
Run Code Online (Sandbox Code Playgroud)
使用此代码的作者有什么意义呢?我试图理解错误,但更重要的是,我正在努力理解代码.任何帮助将不胜感激.
UPDATE
我想我明白为什么这是一个常见的错误,因为当我使用print和Dumper时,我可以直观地看到作者试图传达的内容,这里是修改后的代码.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
for my $i (1..10) {
my @AoA;
my @array = somefunc($i);
print "The array …Run Code Online (Sandbox Code Playgroud) 试图了解范围解析运算符.
$a = 5;
foo();
print "Out a = $a\n";
sub foo() {
local $a = 10;
bar();
}
sub bar() {
print "Inside a = $a\n";
print "Global a = $::a\n";
}
Run Code Online (Sandbox Code Playgroud)
该计划的输出是:
Inside a = 10
Global a = 10
Out a = 5
Run Code Online (Sandbox Code Playgroud)
我希望'$ :: a'的值可以表示为'5'而不是10.我认为这就是范围解析运算符的作用.获取范围值.在这种情况下,没有给出范围,因此具有全球价值.如果有任何调整,请纠正我.
我应该写什么来获得bar子程序中'a'的全局值?
我将在Array of Arrays的部分中查看perldsc的文档,它显示了一个数组数组的样子
@AoA = (
[ "fred", "barney" ],
[ "george", "jane", "elroy" ],
[ "homer", "marge", "bart" ],
);
Run Code Online (Sandbox Code Playgroud)
在第1-4行的下一节中,它将展示如何生成一个
# reading from file
while ( <> ) {
push @AoA, [ split ];
}
Run Code Online (Sandbox Code Playgroud)
我想学习如何创建一个.我创建了一个文件并在其中包含以下内容.
约翰亚当乔
罗德弗雷德詹姆斯
艾莉森弗兰克让
然后我使用示例中的代码创建了一个数组数组
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @AoA;
while ( <> ) {
push @AoA, [ split ];
}
print Dumper(@AoA);
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,Dumper的内容是
$VAR1 = [
'John',
'Adam',
'Joe'
];
$VAR2 = [
'Rod',
'Fred',
'James'
];
$VAR3 = …Run Code Online (Sandbox Code Playgroud)