我们使用Log :: Log4perl记录当前日期,如下所示:
log4perl.appender.perllog.layout.ConversionPattern=%d{yyyyMMdd.hhmmss:}-%P-%H-%p{2}-%m
Run Code Online (Sandbox Code Playgroud)
有没有办法记录时区?
我正在打包一个数字数组,通过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 -n和perl -p选项有什么区别?
什么是证明差异的简单例子?
你如何决定使用哪一个?
我花了太长时间才使用警告; 严格 在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编码.
我有一个我创建的包,用于返回对象的指定属性(缩短的代码)
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) 该代码得到了类似的警告
为什么这段代码会在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?
$str = "A"
print "Yes" if $str in ('A','B','C','D');
Run Code Online (Sandbox Code Playgroud) 我试图使用下面的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年我无法获得预期的结果.
请告知如何解决.谢谢.
迭代列表很容易:
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)
但我得到一个无限循环.
我注意到如果我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)