参数不是按位或(|)处的数字。为什么?

时间:2019-06-25 13:42:52

标签: perl

我正在使用here中的代码:

#!/usr/bin/perl

use strict;
use warnings;

use Fcntl;
my $flags =  "";
fcntl( STDIN, F_GETFL, $flags) || die $!;
$flags |= O_NONBLOCK;
fcntl( STDIN, F_SETFL, $flags) || die $!;

但是出现下一个错误:

Argument "\0O§"­U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0..." isn't numeric in bitwise or (|) at /home/user/inetd-script.pl line 9.

$flags通过fcntl调用进行初始化。请告诉我为什么会发生此错误。

以及解决方法。

UPD
Perl cookbook 7.20.2将其初始化为空字符串。

enter image description here

1 个答案:

答案 0 :(得分:6)

按位运算符有两种形式,字符串和数字。如果任一操作数为数字,或启用了“按位”功能[^ 1],则将其视为按位数字。在这种情况下,如果另一个操作数是字符串,则会将其转换为数字,如果它看起来不像数字,则会生成警告。

您应该将$ flags初始化为0,而不是""

[^ 1]:“按位”功能使普通的按位运算符仅按数字进行按位运算,并添加了新的字符串按位运算符,例如|.