关于这个 问题,手动设置undef列表元素和Perl设置的元素之间有什么区别,当通过分配比列表大小更大的索引来增加该列表的大小时,是否有别名?例如,考虑以下代码:
@a = (undef, 0);
@b = ();
$b[1] = 0;
print Dumper(@a), "\n", Dumper(@b);
Run Code Online (Sandbox Code Playgroud)
它打印(我认为如预期的那样):
$VAR1 = undef;
$VAR2 = 0;
$VAR1 = undef;
$VAR2 = 0;
Run Code Online (Sandbox Code Playgroud)
那么,阵列不一样吗?显然不是:
sub change { $_[0] = 1 }
change(@a); change(@b);
print Dumper(@a), "\n", Dumper(@b);
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
$VAR1 = 1;
$VAR2 = 0;
$VAR1 = undef;
$VAR2 = 0;
Run Code Online (Sandbox Code Playgroud) 假设我有一个大哈希,我想迭代它的内容.标准的习语是这样的:
while(($key, $value) = each(%{$hash_ref})){
///do something
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我理解我的perl,这实际上是做了两件事.首先是
%{$hash_ref}
Run Code Online (Sandbox Code Playgroud)
正在将ref翻译成列表上下文.因此返回类似的东西
(key1, value1, key2, value2, key3, value3 etc)
Run Code Online (Sandbox Code Playgroud)
它将存储在我的堆栈内存中.然后每个方法都会运行,在内存中使用前两个值(key1和value1)并将它们返回到我的while循环进行处理.
如果我对此的理解是正确的,这意味着我已经有效地将我的整个哈希复制到我的堆栈内存中,只是迭代新的副本,这对于大型哈希来说可能是昂贵的,因为迭代数组两次的费用,但是如果两个哈希值都不能同时保存在内存中,也会导致潜在的缓存命中.看起来效率很低.我想知道这是不是真的发生了,或者我是否误解了实际行为,或者编译器是否为我的效率低下了?
跟进问题,假设我对标准行为是正确的.
是否有一种语法可以避免通过在原始哈希中迭代它来复制哈希值?如果不是哈希那么更简单的数组呢?
这是否意味着在上面的示例中,如果我修改了循环中的hash_ref内容,我可能会在哈希副本和实际哈希值之间得到不一致的值; 导致$ value具有不同的值,然后$ hash_ref - >($ key)?
我得到一个奇怪的行为chomp.在<STDIN>增加了换行符的投入,我想删除它,所以我使用格格像下面这样:
print("Enter Your Name:\n");
$n = <STDIN>;
$n = chomp($n);
print("Your Name: $n");
$out = "";
for ($i =0; $i < 10; $i++)
{
$out .= $n;
print ($out);
print("\n");
}
Run Code Online (Sandbox Code Playgroud)
当我输入任何名称值(字符串),如"Fox"时,我希望输出如下:
Fox
FoxFox
FoxFoxFox
FoxFoxFoxFox
etc..
Run Code Online (Sandbox Code Playgroud)
然而,"Fox"被数值替换1即
1
11
111
1111
Run Code Online (Sandbox Code Playgroud)
我试图从关于chomp的perl官方手册中获得帮助,但我无法在那里得到任何帮助.有人会解释为什么chomp会这样做以及如何解决这个问题?
我再次回顾了这本书上的例子,我发现他们使用了chomp无法分配,即:
$n = chomp($n);
# Is replaced by
chomp($n);
Run Code Online (Sandbox Code Playgroud)
事实上,通过这种方式脚本打印输出正如预期!另外我不知道怎么样和为什么?