在末尾设置变量名称和变量 - perl

时间:2017-07-25 21:30:13

标签: perl

$id = 1;
foreach (@products) {
$productid$id = param(product$id);
++$id;
}

我正在尝试遍历产品数组,并为产品中的每个商品创建一个新变量,用于使用复选框选择待售产品的表单。我试图使用$ productid $ id和$ productid" $ id"但它返回了语法错误。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:4)

  

我正在尝试遍历products数组并为产品中的每个项目创建一个新变量。

虽然可以为每个项目创建一个新变量,但这是一个坏主意。它们必须是全局的,语法是丑陋的,并且很难将这些变量作为集合传递。相反, 使用哈希或数组 。在这种情况下,由于您的项目按编号索引,并且没有间隙,因此数组最有意义。

my @product_params;
foreach my $product (@products) {
    push @product_params, param($product);
}

对于$product中的每个@products,它会将param($product)添加到@product_params。例如,$products[5]的参数存储在$product_params[5]

由于这是@products与其参数的一对一映射,因此使用map执行上述操作更容易,更快捷。映射通过函数运行列表的每个元素以创建新列表。 $_依次包含@products的每个元素。

my @product_params = map { param($_) } @products;

答案 1 :(得分:3)

  1. 变量不以单引号插值。
  2. 您正在重复循环的每次迭代中的$ id。
  3. 更新:您的更改使上述两个项目符号无效。

    my $id = 1;
    for my $product (@products) {
        $product_id = param("product$id");
        ++$id;
    }
    

答案 2 :(得分:1)

假设您有四个名为

的复选框
  • product1
  • product2
  • product3
  • product4

说出product1product3

以下内容会将13放入@selected_product_ids

my @selected_product_ids =
      map { my ($id) = /^product(\d+)\z/; defined($id) && param($_) ? $id : () }
         params();

如果您拥有@product_ids中所有现有产品ID的列表,则以下内容也会相同:

my @selected_product_ids =
      grep { param("product$_") }
         @product_ids;