相关疑难解决方法(0)

自动设置为undef的数组元素在别名时不会改变?

关于这个 问题,手动设置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)

perl

17
推荐指数
2
解决办法
313
查看次数

迭代哈希引用是否需要在perl中隐式复制它?

假设我有一个大哈希,我想迭代它的内容.标准的习语是这样的:

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循环进行处理.

如果我对此的理解是正确的,这意味着我已经有效地将我的整个哈希复制到我的堆栈内存中,只是迭代新的副本,这对于大型哈希来说可能是昂贵的,因为迭代数组两次的费用,但是如果两个哈希值都不能同时保存在内存中,也会导致潜在的缓存命中.看起来效率很低.我想知道这是不是真的发生了,或者我是否误解了实际行为,或者编译器是否为我的效率低下了?

跟进问题,假设我对标准行为是正确的.

  1. 是否有一种语法可以避免通过在原始哈希中迭代它来复制哈希值?如果不是哈希那么更简单的数组呢?

  2. 这是否意味着在上面的示例中,如果我修改了循环中的hash_ref内容,我可能会在哈希副本和实际哈希值之间得到不一致的值; 导致$ value具有不同的值,然后$ hash_ref - >($ key)?

perl hash

6
推荐指数
2
解决办法
171
查看次数

Perl chomp将字符串转换为数值

我得到一个奇怪的行为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)

事实上,通过这种方式脚本打印输出正如预期!另外我不知道怎么样和为什么?

perl

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

标签 统计

perl ×3

hash ×1