我现在阅读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这样做的原因是什么?
我可以写这两个:
$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) 没有技术理由不允许@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 -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)
第一种情况有什么问题?
我有下一个哈希:
%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变换
以给定顺序提取哈希键的最短和/或最快方法是什么?
我正在从这里使用代码:
#!/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 -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 _ 相同。
看起来类似这样写:
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