哪些子程序与其他子程序不一样?
sub or1 {
my ($a,$b) = @_;
return $a || $b;
}
sub or2 {
my ($a,$b) = @_;
$a || $b;
}
sub or3 {
my ($a,$b) = @_;
return $a or $b;
}
sub or4 {
my ($a,$b) = @_;
$a or $b;
}
Run Code Online (Sandbox Code Playgroud)
我从C和Perl 4来到Perl 5并一直使用,||直到我看到更多的脚本使用or,我喜欢它的样子.但正如上面的测验所显示的那样,对于那些粗心大意的人来说,这并非没有缺陷.对于同时使用这两种结构或者使用很多结构的人来说or,您使用什么经验法则来决定使用哪种结构并确保代码正在执行您认为正在执行的操作?
我正在使用each迭代Perl哈希:
while (my ($key,$val) = each %hash) {
...
}
Run Code Online (Sandbox Code Playgroud)
然后发生了一些有趣的事情,我想打印出哈希值.起初我考虑的事情如下:
while (my ($key,$val) = each %hash) {
if (something_interesting_happens()) {
foreach my $k (keys %hash) { print "$k => $hash{$k}\n" }
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为每个人都知道在哈希上调用keys(或values)会重置用于的内部迭代器each,我们可能会得到一个无限循环.例如,这些脚本将永远运行:
perl -e '%a=(foo=>1); while(each %a){keys %a}'
perl -e '%a=(foo=>1); while(each %a){values %a}'
Run Code Online (Sandbox Code Playgroud)
没问题,我想.我可以制作哈希的副本,并打印出副本.
if (something_interesting_happens()) {
%hash2 = %hash;
foreach my $k (keys %hash2) { print "$k => $hash2{$k}\n" }
}
Run Code Online (Sandbox Code Playgroud)
但这也行不通.这也会重置each迭代器.实际上,%hash在列表上下文中的任何使用似乎都会重置其each …
我正在尝试解决问题,需要了解这个if语句的含义:
if ($confirmation = $payment_modules->confirmation()) {
Run Code Online (Sandbox Code Playgroud)
我能找到的所有资源只显示带有双等号的语句,而不是单个.这是一个PHP的速记形式吗?它在做什么?
(如果它实际上是错误的语法,将其更改为双等号并不能解决问题.原样,在某些情况下它确实返回true.在我正在排除故障的情况下,它直到我之后才会返回true刷新浏览器.)
任何帮助是极大的赞赏!!!
Perl对readline函数(以及等效的<>I/O运算符)进行了一些特殊处理,它处理表达式
while (<HANDLE>)
while (readline(HANDLE))
Run Code Online (Sandbox Code Playgroud)
相当于
while (defined($_ = <HANDLE>))
Run Code Online (Sandbox Code Playgroud)
比照
$ perl -MO=Deparse -e 'f($_) while <>'
f($_) while defined($_ = <ARGV>); <--- implicitly sets $_
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
但是如果你劫持这个readline功能,这种自动分配似乎不会发生:
$ perl -MO=Deparse -e 'BEGIN {
> *CORE::GLOBAL::readline = sub { }
> }
> f($_) while <>'
sub BEGIN {
*CORE::GLOBAL::readline = sub {
};
}
f($_) while readline(ARGV); <--- doesn't set $_ !
-e syntax OK
Run Code Online (Sandbox Code Playgroud)
当然,这会使自定义readline函数对许多遗留代码的工作不正确.这段代码的输出是"foo"BEGIN块, …
有没有办法判断哈希引用是否指的是符号表?
也就是说,该功能怎么可能
sub foo {
my ($hashref) = @_;
...
}
Run Code Online (Sandbox Code Playgroud)
知道它是否被调用为
foo( \%main:: )
Run Code Online (Sandbox Code Playgroud)
而不是
foo( \%main )
Run Code Online (Sandbox Code Playgroud)
?
应用程序是一个有时tie是哈希变量的函数,但我想避免尝试绑定一个符号表.
此代码运行并生成输出abc:
for(10..12){$_=sprintf"%x",$_;print}
Run Code Online (Sandbox Code Playgroud)
但是这段代码因Modification of a read-only value attempted at ...错误而死:
for(10,11,12){$_=sprintf"%x",$_;print}
Run Code Online (Sandbox Code Playgroud)
为什么这些结构的处理方式不同?
(这段代码也有效:)
for(10..10,11..11,12..12){$_=sprintf"%x",$_;print}
Run Code Online (Sandbox Code Playgroud) 有一个简单的模块
package Rrr;
use 5.014;
use warnings;
use namespace::sweep;
use Moo;
use Method::Signatures::Simple;
BEGIN {
our $VERSION = '0.0.1';
}
has 'root' => (
is => 'rw',
default => 'root'
);
method func {
say 'This is the func method from ' . __PACKAGE__ . ' with value: ', $self->root;
}
1;
Run Code Online (Sandbox Code Playgroud)
该perlcritic -1说
Code is not tidy at line 1, column 1. See page 33 of PBP. (Severity: 1)
Module does not end with "1;" at line …Run Code Online (Sandbox Code Playgroud) 其中一个我CPAN模块是不可用的的activeperl通过它的ppm效用.显然,我对这个模块的单元测试太彻底,而且当它试图构建它时,ActiveState的构建过程会超时.
所以我想在我的测试中做的是检测我的模块何时在ActivePerl上构建,如果是的话,为构建过程提供更小更快的测试集.
($is_activestate) = grep /provided by ActiveState/, qx($^X -v)
Run Code Online (Sandbox Code Playgroud)
但我想知道是否有更轻量级的选择.在ActivePerl中始终(且仅)设置的环境变量?什么东西Config?还有其他建议吗?
更新:$ENV{ACTIVESTATE_PPM_BUILD}在这些构建期间设置的外观.
我经常fork在也有END { ... }块的程序中使用:
...
END { &some_cleanup_code }
...
my $pid = fork();
if (defined($pid) && $pid==0) {
&run_child_code;
exit 0;
}
Run Code Online (Sandbox Code Playgroud)
子进程在END {}退出时执行块,但通常我不希望发生这种情况.有没有办法阻止子进程END在退出时调用块?除此之外,有没有办法让程序"知道"它是一个子进程,所以我可以说类似的东西
END { unless (i_am_a_child_process()) { &some_cleanup_code } }
Run Code Online (Sandbox Code Playgroud)
?
背景 - 我想从csv文件中提取特定列.csv文件以逗号分隔,使用双引号作为text-qualifier(可选,但是当字段包含特殊字符时,限定符将在那里 - 参见示例),并使用反斜杠作为转义字符.某些字段也可能为空白.
示例输入和所需输出 - 例如,我只希望列1,3和4位于输出文件中.csv文件中列的最终提取应与原始文件的格式匹配.不应删除任何转义字符或添加额外的引号等.
输入
"John \"Super\" Doe",25,"123 ABC Street",123-456-7890,"M",A
"Jane, Mary","",132 CBS Street,333-111-5332,"F",B
"Smith \"Jr.\", Jane",35,,555-876-1233,"F",
"Lee, Jack",22,123 Sesame St,"","M",D
Run Code Online (Sandbox Code Playgroud)
期望的输出
"John \"Super\" Doe","123 ABC Street",123-456-7890
"Jane, Mary",132 CBS Street,333-111-5332
"Smith \"Jr.\", Jane",,555-876-1233
"Lee, Jack",123 Sesame St,""
Run Code Online (Sandbox Code Playgroud)
初步脚本(awk) - 以下是我发现的初步脚本大部分都有效,但在我注意到的一个特定实例中不起作用,可能还有更多我尚未看到或想到的
#!/usr/xpg4/bin/awk -f
BEGIN{ OFS = FS = "," }
/"/{
for(i=1;i<=NF;i++){
if($i ~ /^"[^"]+$/){
for(x=i+1;x<=NF;x++){
$i=$i","$x
if($i ~ /"+$/){
z = x - (i + 1) + 1
for(y=i+1;y<=NF;y++)
$y = $(y + z)
break …Run Code Online (Sandbox Code Playgroud)