Strawberry Perl 是 %ENV 一个普通的对象
Strawberry Perl Is %ENV An Ordinary Object
所以,在 Strawberry Perl 中,%ENV 似乎是一个普通的散列(至少它没有绑定),
但它似乎也不区分大小写地解析键。考虑到环境,这是有道理的
变量在 PowerShell 中不区分大小写(我不确定它们之间的确切关系
Windows 环境变量和大小写)。所以,我想知道 %ENV 如何同时成为
普通散列,并具有 "implicit" 键,当您称它们为内置键时,这些键未列出。
%ENV hash 不用绑定就神奇吗?
use strict;
use warnings;
# Env appears to be an ordinary hash
# 'TEMP' is present in the list of environment variables
# but 'temp' is not
printf "$_\n" foreach keys %ENV;
print "\n";
# this gives us the value of $ENV:TEMP
# which makes sense.
printf "uppercase 'temp' maps to %s\n", $ENV{TEMP};
# even though temp is not present in the
# list of keys, the same value appears as for
# $ENV{TEMP}
# This seems to make sense given the behavior of powershell
# (I am not quite sure what the relationship is between
# Windows environment variables and case, but this seems reasonable.)
printf "lowercase 'temp' maps to %s\n", $ENV{temp};
# However, %ENV is not a tied hash.
printf "Tie status: %s\n", tied(%ENV) // "not a tied variable";
Is the %ENV hash magical without being tied?
是的,%ENV 是一个没有绑定的神奇变量,类似于 %SIG 等各种其他变量。有关更多信息,请参阅 perldoc perlvar。
以下内容来自 ActivePerl,但包括 Strawberry Perl 在内的每个 Perl 都会给您同样的东西:
>perl -E"use Devel::Peek; Dump(\%ENV, 1);"
SV = IV(0x74b154) at 0x74b154
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x63e33c
SV = PVHV(0x62a8ac) at 0x63e33c
REFCNT = 2
FLAGS = (SMG,RMG,SHAREKEYS)
MAGIC = 0x639084 <-------
MG_VIRTUAL = &PL_vtbl_env
MG_TYPE = PERL_MAGIC_env(E)
ARRAY = 0x640794 (0:30, 1:22, 2:11, 3:1)
hash quality = 107.7%
KEYS = 47
FILL = 34
MAX = 63
如您所见,%ENV
很神奇。但它没有绑定;那将是魔术类型 "P" 而不是 "E".
所以,在 Strawberry Perl 中,%ENV 似乎是一个普通的散列(至少它没有绑定), 但它似乎也不区分大小写地解析键。考虑到环境,这是有道理的 变量在 PowerShell 中不区分大小写(我不确定它们之间的确切关系 Windows 环境变量和大小写)。所以,我想知道 %ENV 如何同时成为 普通散列,并具有 "implicit" 键,当您称它们为内置键时,这些键未列出。 %ENV hash 不用绑定就神奇吗?
use strict;
use warnings;
# Env appears to be an ordinary hash
# 'TEMP' is present in the list of environment variables
# but 'temp' is not
printf "$_\n" foreach keys %ENV;
print "\n";
# this gives us the value of $ENV:TEMP
# which makes sense.
printf "uppercase 'temp' maps to %s\n", $ENV{TEMP};
# even though temp is not present in the
# list of keys, the same value appears as for
# $ENV{TEMP}
# This seems to make sense given the behavior of powershell
# (I am not quite sure what the relationship is between
# Windows environment variables and case, but this seems reasonable.)
printf "lowercase 'temp' maps to %s\n", $ENV{temp};
# However, %ENV is not a tied hash.
printf "Tie status: %s\n", tied(%ENV) // "not a tied variable";
Is the %ENV hash magical without being tied?
是的,%ENV 是一个没有绑定的神奇变量,类似于 %SIG 等各种其他变量。有关更多信息,请参阅 perldoc perlvar。
以下内容来自 ActivePerl,但包括 Strawberry Perl 在内的每个 Perl 都会给您同样的东西:
>perl -E"use Devel::Peek; Dump(\%ENV, 1);"
SV = IV(0x74b154) at 0x74b154
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x63e33c
SV = PVHV(0x62a8ac) at 0x63e33c
REFCNT = 2
FLAGS = (SMG,RMG,SHAREKEYS)
MAGIC = 0x639084 <-------
MG_VIRTUAL = &PL_vtbl_env
MG_TYPE = PERL_MAGIC_env(E)
ARRAY = 0x640794 (0:30, 1:22, 2:11, 3:1)
hash quality = 107.7%
KEYS = 47
FILL = 34
MAX = 63
如您所见,%ENV
很神奇。但它没有绑定;那将是魔术类型 "P" 而不是 "E".