标签: perl

%s是唯一允许printf正确显示大整数的格式吗?

我只花了一个划时代搞清楚,我的大整数是个好人,是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)

如果答案是否定的话,我不会感到惊讶,只是想确认一下.

perl printf biginteger

3
推荐指数
1
解决办法
225
查看次数

\&和$ expr的用法是什么 - >()

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

3
推荐指数
1
解决办法
2116
查看次数

perl - 在作为另一个对象的访问者的对象列表中搜索

我是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)

oop perl moose

3
推荐指数
1
解决办法
99
查看次数

如何在Perl中使用正则表达式拆分字符串?

我在Perl中有一个字符串:'CCCCCCCC^hC^iC^*C^"C^8A'.

我想使用正则表达式拆分此字符串:"^[any_character]C".换句话说,我想用实际字符分隔它^,然后是任何字符,后跟一个特定的字母(在这种情况下C,但它可以是A,或任何其他字符).

我试过看其他问题/帖子,最后提出了我的问题@split_str = split(/\^(\.)C/, $letters),但这似乎没有用.

我确定我做错了什么,但我不知道是什么.

regex string perl

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

Perl DateTime"is_dst()"方法无法正常工作

我正在尝试使用模块中的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)

perl datetime dst

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

比较日文字符的问题

我正在努力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)

unicode perl perl-module collation utf-8

3
推荐指数
1
解决办法
123
查看次数

perl - 短因子计算器返回1的长字符串

我正在尝试制作一个计算数字阶乘的程序.我对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的帖子,所以我希望我遵守所有这些规则.

syntax perl loops factorial while-loop

3
推荐指数
1
解决办法
71
查看次数

了解perl中的数据结构

我正在尝试理解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)

perl

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

如何在Perl中获取全局变量值?

试图了解范围解析运算符.

$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)
  1. 我希望'$ :: a'的值可以表示为'5'而不是10.我认为这就是范围解析运算符的作用.获取范围值.在这种情况下,没有给出范围,因此具有全球价值.如果有任何调整,请纠正我.

  2. 我应该写什么来获得bar子程序中'a'的全局值?

perl

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

了解数组数组

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

perl

3
推荐指数
1
解决办法
91
查看次数