标签: perl

如何使用Log :: Log4perl记录时区?

我们使用Log :: Log4perl记录当前日期,如下所示:

log4perl.appender.perllog.layout.ConversionPattern=%d{yyyyMMdd.hhmmss:}-%P-%H-%p{2}-%m
Run Code Online (Sandbox Code Playgroud)

有没有办法记录时区?

perl logging timezone log4perl

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

打包和解包浮点数时,如何消除浮点不准确?

我正在打包一个数字数组,通过UDP使用套接字编程发送到另一个硬件.

当我pack的数字12.2然后unpack它,我得到12.199999892651.当我处理与纬度和经度相关的数字时,我不能有这样的偏差.

这是我写的简单脚本:

use warnings;

use Time::HiRes qw (sleep);

@Data = ( 20.2, 30.23, 40.121, 1, 2, 3, 4, 6. 4, 3.2, 9.9, 0.1, 12.2, 0.99, 7.8, 999, 12.3 );

$myArr = pack('f*', @Data);

print "$myArr\n\n";

@Dec = unpack('f*',$myArr);

print "@Dec";
Run Code Online (Sandbox Code Playgroud)

输出是:

20.2000007629395 30.2299995422363 40.1209983825684 1 2 3 4 6.40000009536743 3.20 000004768372 9.89999961853027 0.100000001490116 12.1999998092651 0.9900000095367 43 7.80000019073486 999 12.3000001907349
Run Code Online (Sandbox Code Playgroud)

有什么方法可以控制精度吗?

perl unpack pack

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

"perl -n"和"perl -p"有什么区别?

perl -nperl -p选项有什么区别?

什么是证明差异的简单例子?

你如何决定使用哪一个?

perl

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

在Perl子例程中定义局部临时变量的位置?

我花了太长时间才使用警告; 严格 在Perl,但现在我做了,我看到了优点.

我还不确定的一件事是何时定义一个临时变量.这似乎是一件微不足道的事情,但我运行了很多蒙特卡罗模拟,其中失去一点时间加起来超过10000次迭代.我一直懒得在更快的模拟上使用严格/警告,但它们变得更加复杂,所以我真的需要.

所以(切掉代码来计算东西)我想知道是否

sub doStuff
{
  my $temp;
  for my $x (1..50)
  {
    $temp = $x**2;
  }
  for my $x (1..50)
  {
    $temp = $x**3;
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

sub doStuff
{
  for my $x (1..50)
  {
    my $temp = $x**2;
  }
  for my $x (1..50)
  {
    my $temp = $x**3;
  }
}
Run Code Online (Sandbox Code Playgroud)

效率更低/更高,或者如果违反了一些我还不知道的Perl编码.

perl scope

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

如何在perl中返回正确的对象属性?

我有一个我创建的包,用于返回对象的指定属性(缩短的代码)

package vendor_info;

my $vars;
sub new{
    my $class = shift;
    $vars = {
        _servers => shift,
        _locations => shift,
        _favorite => shift,
        _default_selection => shift,
        _database => shift,
        _DB => shift};

    bless $vars, $class;
    return $vars;
}
sub get_locations{
    return $vars->{_locations};
}

sub get_database{
    return $vars->{_database};
}
sub get_DB{
    return $vars->{_DB};
}
Run Code Online (Sandbox Code Playgroud)

我的perl文件接收从终端解析的输入,但在这种情况下,变量$ vendor被硬编码用于测试.我有一个散列中的对象列表,我想根据对象返回正确的属性.一些变量已使用占位符删除.

$vendor = "atrena";

my %vendor_hash = (
    "atrena" => new vendor_info("Variable_server","Variable_location","Advanced_CDC|CDC dftso|DFT|gui|GUI|adv_checker|Lint|spl-view-only|view-only-GUI","adv_checker","database","DB"),

    "ansys" => new vendor_info("Variable","Location","agppi|agppi|ane3fl|ane3fl|ansys|ansys|ensemble_gui|ensemble_gui|hfss_desktop|hfss_desktop|hfss_gui|hfss_gui|hfss_solve|hfss_solve|hfsshpc_pack|hfsshpc_pack|optimetrics|optimetrics|q3d_desktop|q3d_desktop|rdacis|rdacis|struct|struct","ane3fl","database", "db"),

    "coventor" => new vendor_info("var","location","COV_ZsplatViewer|Viewer|COV_VoxelModeler|Voxel-Modeler|MEMSp_Import_Package|Import-Package|MEMSp_Innovator_Plugin|Innovator-Plugin|MEMSp_MATLAB_Simulation|MATLAB-Simulation|MEMSp_Platform|Platform|MTI_AutoBuilder|Auto-Builder|MTI_Catapult|Catapult|MTI_CoventorWare|Coventor-Ware|MTI_Memcap|Memcap|MTI_PreProcessor|PreProcessor","database","db","db")   

);

$vendor_object = $vendor_hash{$vendor}; …
Run Code Online (Sandbox Code Playgroud)

perl hash object

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

在void上下文中无用的匿名哈希({})

该代码得到了类似的警告

为什么这段代码会在void context"警告中抛出"无用的匿名散列({}).

在我使用strict之前,警告不会出现.当我尝试在一个更大的子程序中使用这个代码时,使用严格它会失败,所以我想弄清楚为什么下面的代码在我使用严格时给了我这个警告.

#!/usr/bin/perl
use strict;
use warnings;

sub foo {
    my %args=@_;
    my %defaults=(my $config=>'kconfig', my $mem=>'kmem', my $baz=>7);
    foreach (keys %defaults) {
        defined ($args{$_})  || {$args{$_}= $defaults{$_}} ;
        print $_ ," - ",$args {$_},"\n";
    }
}

&foo (bar=>"1");
Run Code Online (Sandbox Code Playgroud)

perl

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

如何检查变量是否在列表中?

有没有办法做这样的事情perl

$str = "A"
print "Yes" if $str in ('A','B','C','D');
Run Code Online (Sandbox Code Playgroud)

perl list set

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

为什么perl无法在2038年转换unix时间戳?

我试图使用下面的perl命令将纪元时间转换为可读的本地时间:

       bash-3.2$ perl -le print\ scalar\ localtime\ 32503651200
       Thu Mar  9 19:13:52 1911
Run Code Online (Sandbox Code Playgroud)

在2038年之后可以正确转换,但是对于年份数大于2038年我无法获得预期的结果.

请告知如何解决.谢谢.

perl year2038

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

Perl:是否可以迭代匿名哈希?

迭代列表很容易:

foreach my $elem ( 1, 2, 3, 4, 5 ) {
  say $elem;
}
Run Code Online (Sandbox Code Playgroud)

或匿名数组:

foreach my $elem (@{[ 1, 2, 3, 4, 5 ]}) {
  say $elem;
}
Run Code Online (Sandbox Code Playgroud)

但是有可能对匿名哈希做同样的事情吗?我试过了:

while (my ($key, $value) = each (%{{ a => 1, b => 2, c => 3 }})) {
  say "$key=$value";
}
Run Code Online (Sandbox Code Playgroud)

但我得到一个无限循环.

perl hash foreach anonymous-types

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

三元运算符不允许迭代运算符,但if-else呢?

我注意到如果我if-else用一个三元运算符替换我正在使用的语句,当我尝试运行我的代码时,我得到一个编译错误.我相信罪魁祸首就是foreach()我内心的循环if-else.你知道为什么三元运算符的行为与此实例中的if-else构造的行为不同吗?

我的代码看起来像这样

#!/program/perl_v5.6.1/bin/perl5.6.1

use strict;
use warnings;


my $fruits_array_ref = &get_fruits();
if($fruits_array_ref != 0) {
    print("$_ is a fruit.\n") foreach(@$fruits_array_ref);
}
else {
    print("Maybe you like vegetables?\n");
}


sub get_fruits() {
    my @fruit_list;
    my $shopping_list = "/home/lr625/grocery_items";

    open(my $shopping_list_h, "<", $shopping_list) or die("Couldn't open.\n");
    while(my $line = <$shopping_list_h>) {
        next if $line =~ /^\#/;
        chomp($line);
        push(@fruit_list, $line);
    }
    close($shopping_list_h) or die("Couldn't close.\n");

    scalar(@fruit_list) > 0 ? return(\@fruit_list) : return(0);
}
Run Code Online (Sandbox Code Playgroud)

我在购物清单中的数据看起来像

# this is …
Run Code Online (Sandbox Code Playgroud)

perl foreach ternary-operator

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