小编Eug*_*kov的帖子

为什么perl $$原型没有抓住两个参数

我现在阅读http://www.perlmonks.org/?node_id=861966 但我对内部问题有疑问

造成原型sub atan2($$)的原因是什么?不会导致解析器只抓取两个参数:

所以

@a = (atan2 1, 2, 3);
Run Code Online (Sandbox Code Playgroud)

没有成为

@a = (atan2(1, 2), 3);
Run Code Online (Sandbox Code Playgroud)

不允许perl这样做的原因是什么?

perl prototype

0
推荐指数
1
解决办法
103
查看次数

如何将两个表达式写成一个?

我可以写这两个:

$var =  tied $$var;  # History=HASH(0x192a540)
$var->{ desc };      # object description info
Run Code Online (Sandbox Code Playgroud)

用一个表达式:

${tied $$var}->{ desc };
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Not a SCALAR reference at ...
Run Code Online (Sandbox Code Playgroud)

perl

0
推荐指数
1
解决办法
63
查看次数

为什么perl不允许子例程的%hash,@ array参数?

没有技术理由不允许@array和/或%hash作为子程序的参数.例如:push @list, 1, 2, - 允许.

我们可以通过原型实现这一目标:

mypop (\@)
Run Code Online (Sandbox Code Playgroud)

但同样我们得到数组/哈希作为参考:

sub test (\%\@) {
    my( $hash, $array ) =  @_;
    ...
Run Code Online (Sandbox Code Playgroud)

不允许接下来的历史原因是什么?

my( %hash, @array ) =  @_;
Run Code Online (Sandbox Code Playgroud)

禁止这个有什么好处?

perl

0
推荐指数
1
解决办法
102
查看次数

为什么我得到`不能在...错误时使用未定义的值作为符号引用?

在我的程序中,我得到错误:

$ perl -e 'print $i +0'
Can't use an undefined value as a symbol reference at -e line 1.
Run Code Online (Sandbox Code Playgroud)

但接下来的两个工作正常:

$ perl -e 'print $i'
$ perl -e 'print 0 +$i'
0
Run Code Online (Sandbox Code Playgroud)

第一种情况有什么问题?

perl runtime-error

0
推荐指数
1
解决办法
407
查看次数

如何按给定顺序提取哈希键?

我有下一个哈希:

%hash =  (
  name => {
     pos => 1
  },
  name_xxx => {
     pos => 2
  },
  name_yyy => {
     pos => 3
  },
)
Run Code Online (Sandbox Code Playgroud)

并且想要构造下一个数组(键必须按顺序排列pos):

qw/ name name_xxx name_yyy /
Run Code Online (Sandbox Code Playgroud)

我想我应该做Schwartzian变换

以给定顺序提取哈希键的最短和/或最快方法是什么?

perl data-structures

0
推荐指数
1
解决办法
55
查看次数

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

我正在从这里使用代码:

#!/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 $!;
Run Code Online (Sandbox Code Playgroud)

但是得到下一个错误:

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.
Run Code Online (Sandbox Code Playgroud)

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

以及如何解决。

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

在此处输入图片说明

perl

0
推荐指数
1
解决办法
84
查看次数

0
推荐指数
1
解决办法
503
查看次数

-l _ 之前的统计信息不是 lstat

看两个例子:

$ perl -e ' print -e "registrar" && -d _ ? "YES" : "NO" '
YES

$ perl -e ' print -e "registrar" && -l _ ? "YES" : "NO" '
The stat preceding -l _ wasn't an lstat at -e line 1.
Run Code Online (Sandbox Code Playgroud)

-d-l都是文件测试操作符。为什么第二个不起作用?-l _ 之前的统计信息与 -d _ 相同。

perl

0
推荐指数
1
解决办法
94
查看次数

“状态”和“常量”有什么区别?

看起来类似这样写:

use Const::Fast;
const $xx, 77;
sub test {
    do_something_with( $xx );    
}
Run Code Online (Sandbox Code Playgroud)

或者

sub test {
    state $xx =  77;
    do_something_with( $xx );    
}
Run Code Online (Sandbox Code Playgroud)

实现此目的的更好方法是什么:viaconst或via state

sub get_ip_country {
    my ($ip_address) = @_;
    my $ip_cc_database = GeoIP2::Database::Reader->new(file => '/etc/project/GeoLite2-Country.mmdb');
    ...
}
Run Code Online (Sandbox Code Playgroud)

UPD
在这个子我没有更改指向geoip数据库的指针,所以它应该是const。但我不想每次调用 sub 时都重新创建对象(这很慢)。所以我想尽管指针没有改变,但使用起来会更快state

看来应该是const state $ip_cc_database

perl readonly-variable

-1
推荐指数
1
解决办法
230
查看次数