在许多C和C++文件中,我见过这样的宏:
#ifdef X
#undef X // no statements in between
#endif
Run Code Online (Sandbox Code Playgroud)
我觉得,只需写下来就足够了:
#undef X
Run Code Online (Sandbox Code Playgroud)
如果X
未定义宏,则#undef
应该没有效果.
它是确定把独立的#undef
,如果我想只取消定义宏?这是否会使编码练习变得糟糕?
下
use strict;
use warnings;
my $foo = undef;
Run Code Online (Sandbox Code Playgroud)
表达式
$foo . ''
Run Code Online (Sandbox Code Playgroud)
和
"$foo"
Run Code Online (Sandbox Code Playgroud)
都生产
Use of uninitialized value $foo in ... at ...
Run Code Online (Sandbox Code Playgroud)
但是下面的表达式给出了没有警告的空字符串:
$foo x 1
Run Code Online (Sandbox Code Playgroud)
谁知道为什么?我的意思是,有一个很好的字符串化习惯($_ x 1
比defined ? "$_" : ''
它短得多)很酷,但感觉有点奇怪.
在从Perl中的配置文件中读取时,可能存在一行无效且不需要添加到我的有效行数组的情况.由于我在这里使用for循环,即使是无效行也会创建一个undef条目.我怎样才能将它们全部删除?
谢谢!
当你引用一个undef值而不仅仅是警告时,你如何让Perl停下来并给出一个堆栈跟踪?这似乎use strict;
不足以达到这个目的.
如何删除tcl过程?
一罐
unset
一个变量, interp alias {} myproc {} otherproc
,namespace import -force
.但我没有办法让程序不为人知.
这段代码就像我期望的那样死掉:
use strict;
use warnings;
open my $fh, "<", "" or die $!;
Run Code Online (Sandbox Code Playgroud)
但这不是:
use strict;
use warnings;
open my $fh, "<", undef or die $!;
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
我有一个这种形式的片段:
my $a = $some_href->{$code}{'A'}; # a number or undef
my $b = $some_href->{$code}{'B'}; # a number or undef
$a = 0 unless defined($a);
$b = 0 unless defined($b);
my $total = $a + $b;
Run Code Online (Sandbox Code Playgroud)
由于涉及两个以上的变量,现实更加混乱.
我真正想写的是:
my $total = $some_href->{$code}{'A'} + $some_href->{$code}{'B'};
Run Code Online (Sandbox Code Playgroud)
并且undef正确评估为0,但几乎每次运行都会收到这些警告:
Use of uninitialized value in addition (+) at Stats.pm line 192.
Run Code Online (Sandbox Code Playgroud)
让这些消息消失的最佳方法是什么?
注意:如果相关,我会使用严格的'和'使用警告'.
任务:使用map构建哈希,其中keys是给定数组@a的元素,值是某些函数f($ element_of_a)返回的列表的第一个元素:
my @a = (1, 2, 3);
my %h = map {$_ => (f($_))[0]} @a;
Run Code Online (Sandbox Code Playgroud)
好的,直到f()返回一个空列表(对f()来说绝对正确,在这种情况下我想分配undef).可以使用以下代码重现该错误:
my %h = map {$_ => ()[0]} @a;
Run Code Online (Sandbox Code Playgroud)
错误本身听起来像"散列分配中奇数个元素".当我重写代码时:
my @a = (1, 2, 3);
my $s = ()[0];
my %h = map {$_ => $s} @a;
Run Code Online (Sandbox Code Playgroud)
要么
my @a = (1, 2, 3);
my %h = map {$_ => undef} @a;
Run Code Online (Sandbox Code Playgroud)
Perl根本没有抱怨.
那么我该如何解决这个问题 - 当返回的列表为空时,获取f()返回的列表的第一个元素?
Perl版本是5.12.3
谢谢.
简短的问题
在Perl代码库中一致表示真假的最佳方法是什么?
1
/ 0
?
1
/ Perl的本机布尔运算符
返回的特殊空字符串?
undef
?
()
(即空列表)?
问题背景
我们都知道Perl在布尔方面非常灵活,就像大多数事情一样.
例如,Perl将以下内容视为false:,undef()
数字0
(即使写为000或0.0),空字符串'0'
(包含单个0位的字符串).Perl将以下作为真:任何其他的标量值,1
,-1
,在它(一个空格的字符串' '
),'00'
多个0的串,"0\n"
(跟着一个新行"0"), , 'true'
,'false'
,'undef'
等等另外,基于阵列to-scalar和list-to-scalar转换意味着你可以经常使用空数组作为假值.(感谢http://perlmaven.com/boolean-values-in-perl获取Perl接受为真或假的标量值的部分列表.)
但是考虑到所有这些被视为true或false的值,Perl布尔函数应该返回什么?
1/0
-1/0
(全息)1/undef
1/""
如果您使用这些约定中的任何一个,您将很快发现您编写的代码的行为与普通的Perl代码不同.您将无法取代$a<$b
的custom_less_than($a,$b)
,并有它的工作原理完全相同.
考虑:
> perl -e 'use warnings;
sub my_eq { return ( $_[0]==$_[1] ? 1 : 0 ) }
print "compare (1==0) <<".(1==0).">>"
." to my_eq(1,0) <<".my_eq(1,0).">>" …
Run Code Online (Sandbox Code Playgroud) 请看下面的代码:
use strict;
use warnings;
print "subroutine is defined\n" if defined &myf;
myf();
sub myf
{
print "called myf\n";
}
undef &myf;
#myf();
print "now subroutine is defined\n" if defined &myf;
Run Code Online (Sandbox Code Playgroud)
输出是
subroutine is defined
called myf
Run Code Online (Sandbox Code Playgroud)
第一个print
语句可以打印,这是否意味着解释器(或编译器?)看得更远并看到子例程定义?如果是这样,为什么它没有看到undef &myf;
第二个print
陈述?
谢谢