标签: undef

在#undef之前我们什么时候需要#ifdef?

在许多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,如果我想只取消定义宏?这是否会使编码练习变得糟糕?

c c++ macros coding-style undef

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

为什么Perl的字符串乘法不会对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 1defined ? "$_" : ''它短得多)很酷,但感觉有点奇怪.

perl warnings undef

20
推荐指数
1
解决办法
398
查看次数

如何从数组中删除所有undefs?

在从Perl中的配置文件中读取时,可能存在一行无效且不需要添加到我的有效行数组的情况.由于我在这里使用for循环,即使是无效行也会创建一个undef条目.我怎样才能将它们全部删除?

谢谢!

arrays perl undef

16
推荐指数
1
解决办法
7673
查看次数

如何在引用undef值时让Perl停止?

当你引用一个undef值而不仅仅是警告时,你如何让Perl停下来并给出一个堆栈跟踪?这似乎use strict;不足以达到这个目的.

perl warnings undef

15
推荐指数
2
解决办法
2575
查看次数

如何删除Tcl程序?

如何删除tcl过程?

一罐

  • unset 一个变量,
  • 覆盖别名,用interp alias {} myproc {} otherproc,
  • 用一个在另一个命名空间内定义的proc覆盖一个proc namespace import -force.

但我没有办法让程序不为人知.

procedure tcl undef

10
推荐指数
1
解决办法
6434
查看次数

为什么打开undef不会失败?

这段代码就像我期望的那样死掉:

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)

这里发生了什么?

perl undef

9
推荐指数
1
解决办法
122
查看次数

在Perl中,是否有手动将undef转换为0的优雅方式?

我有一个这种形式的片段:

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)

让这些消息消失的最佳方法是什么?

注意:如果相关,我会使用严格的'和'使用警告'.

perl undef

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

Perl:映射到列表的第一个元素

任务:使用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

谢谢.

arrays perl hash undef map

7
推荐指数
1
解决办法
1306
查看次数

Perl中的布尔函数应该返回什么值?

简短的问题

在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<$bcustom_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)

perl boolean undef

7
推荐指数
2
解决办法
6392
查看次数

Perl`defined'和`undef'子例程范围

请看下面的代码:

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陈述?

谢谢

perl undef subroutine defined

6
推荐指数
1
解决办法
141
查看次数

标签 统计

undef ×10

perl ×8

arrays ×2

warnings ×2

boolean ×1

c ×1

c++ ×1

coding-style ×1

defined ×1

hash ×1

macros ×1

map ×1

procedure ×1

subroutine ×1

tcl ×1