【问题标题】:Perl equivalent of PHP's compact()?Perl 相当于 PHP 的 compact()?
【发布时间】:2014-09-24 07:27:18
【问题描述】:

我在其他语言中看到了与 PHP's compact function 等效的问题,但在 Perl 中没有看到,如果这是对我错过的事情的重复,请原谅我。如果你不熟悉这个功能,这里就是我要找的。​​p>

给定变量:

my $one = "1";
my $two = "2";
my $three = "3";

#using compact as example here since this function doesn't exist in perl
my $array = compact("one","two","three");

然后转储 $array 将给出:

[
    one => "1,
    two => "2",
    three => "3"
]

来自PHP documentation for compact

创建一个包含变量及其值的数组。

对于其中的每一个,compact() 在当前符号表中查找具有该名称的变量并将其添加到输出数组中,使得变量名称成为键,变量的内容成为该键的值.

我专门使用版本 5.8.8。如果我的某些语法不正确,请原谅我。我的背景是 PHP。

【问题讨论】:

  • 你想要完成什么需要compact()?
  • 我可能会误解,但这看起来很像using variables as variable names。糟糕。
  • 谢天谢地,在 perl 中没有类似的东西,强加于一种语言似乎是一件可怕的事情。如果您解释您正在尝试做什么而不是如何尝试,那么这里的某人可能会帮助您找到更好的解决方案(可能涉及哈希)。
  • 如果你只是想导入/导出变量,你可能想看看这个答案:stackoverflow.com/questions/4543934/…
  • 需求最终发生了变化,这不再是必要的。当时的情况是我在子例程中实例化动态变量,并计划在模板中使用这些动态变量。这实际上只是一种风格偏好,但我想通过 "my $template_vars = compact("one","two","three");" 将它们作为键/值对数组传递而不是单个参数。要求发生了一些变化,所以我不再走这条路。我发现这个函数在 PHP 中很有用,不过我也在寻找类似的东西。

标签: perl


【解决方案1】:

代替:

my $one = "1";
my $two = "2";
my $three = "3";

#using compact as example here since this function doesn't exist in perl
my $array = compact("one","two","three");

可能你想要:

use strict;
use warnings;
use feature 'say';
use Data::Dumper;

my $numbers = {
    one => 1,
    two => 2,
    three => 3,
};

say Dumper $numbers;
my $sum = $numbers->{one} + $numbers->{two};
say $sum;

【讨论】:

    【解决方案2】:

    如果变量被声明为包变量(例如$::one = 1our $one = 1),那么可以通过检查符号表来做到这一点。但是,我强烈建议不要这样做。我已经编写 Perl 超过 20 年了,我从来没有这样做过。而是从一开始就使用哈希。

    请,请不要这样做。但是,如果您陷入困境并且真的很难找到解决方案,那么这里有一个。它仅适用于声明为包变量的简单标量值(如您的示例中)。

    my %hash = map { $_ => ${$::{$_}} } qw{one two three};
    

    或者:

    sub compact { +{ map { $_ => ${$::{$_}} } @_ } }
    
    my $hashref = compact("one", "two", "three");
    

    【讨论】:

      猜你喜欢
      • 2015-05-20
      • 2011-03-25
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2011-04-01
      • 2018-11-16
      • 1970-01-01
      相关资源
      最近更新 更多