【问题标题】:perl + create loop to print values from INI fileperl + 创建循环以打印 INI 文件中的值
【发布时间】:2010-07-16 07:51:19
【问题描述】:

我叫阿比

我的第一个 perl 脚本在 linux 机器上运行

此脚本读取名为 (input) 的 INI 文件并打印 val 、 param 、 name .....

如何创建循环以打印 val1-valn 的值或循环以打印 param1-paramn... 的值等? (在脚本中放置打印命令)

  • 循环必须具有匹配参数的选项 例如只打印 param1 直到 paramn 值

n - 是每个参数的最后一个数字

 #!/usr/bin/perl




 open(IN,"input") or die "Couldn't open input: $!\n"; 
 while(<IN>) { 
 chomp; 
 /^([^=]+)=(.*)$/; 
 $config{$1} = $2; 

 } 
 close(IN);


 print $config{val1};
 print $config{val2};
 print $config{val3};

 print $config{param1};
 print $config{param2};
 print $config{param3}; 

 print $config{name1};
 .
 .
 .
 .

linux机器的ini文件示例

猫输入

  val1=1
  val2=2
  val3=3
  param1=a
  param2=b
  param3=c
  name1=abbi
  name2=diana
  name3=elena

【问题讨论】:

    标签: perl


    【解决方案1】:

    您可以使用Config::Tiny 来读取您的.ini 文件。 然后你可以使用返回的哈希来过滤你想要的。

    【讨论】:

      【解决方案2】:

      根据您的最后评论,这将满足您的要求:

      use strict;
      use warnings;
      
      my %config;
      my $max_n = 0;
      my $input = 'input';
      open my $in, '<', $input
          or die "unable to open '$input' for reading: $!";
      while (<$in>) {
          chomp;
          if (/^(.*?(\d+))\s*=(.*)$/) { 
              $config{$1} = $3; 
              $max_n = $2 if $2 > $max_n;
          }
      }
      close $in or die "unable to close '$input': $!";
      
      for my $n(1..$max_n) {
          for my $param (qw/val param/) {
              print "$param.$n = $config{$param.$n}\n" if exists $config{$param.$n};
          }
      }
      

      【讨论】:

      • 嗨 M42 对你来说同样的问题:,我可以在地方参数中设置参数吗,例如在地方参数我设置 $param ,并且 $param 可以是任何词?阿比——
      • 另一个问题,为了先一起打印 val1 和 param1,然后在第二个循环 val2 和 param2 等上打印,需要在脚本中进行哪些更改......,abbi
      • 嗨 M42 看到我收到错误全局符号“$max_n”需要在 ./new_ini 第 22 行显示明确的包名称。
      • 你真的复制粘贴代码吗?我想你在第 5 行忘记了我的 $max_n。
      • 没有副本是可以的($max_n)在我确定这一行 -:( abbi
      【解决方案3】:

      这个怎么样:

      use warnings;
      use strict;
      my %config;
      
      open my $input, "<", "input"
          or die "Couldn't open input: $!\n"; 
      while(<$input>) { 
          chomp; 
          if ( /^([^=]+)=(.*)$/) { 
              $config{$1} = $2; 
          }
      } 
      close($input) or die $!;
      
      for (sort keys %config) {
          if (/param\d+/) {
              print "$config{$_}\n";
          }
      }
      

      【讨论】:

      • 嗨 Kinopiko ,我可以在地方参数中设置参数吗?例如在地方参数中我设置了 $param ,并且 $param 可以是任何单词?阿比
      • 小问题例如如果 param1A 它也匹配它,如果 param 在右侧有一些字符作为 param1X 那么它不能匹配它,规则必须例如 param 如何解决这个问题?
      • @abbi:在正则表达式的末尾使用 $。
      • 另一个问题,为了先一起打印 val1 和 param1,然后在第二个循环 val2 和 param2 等上打印,需要在脚本中进行哪些更改......,abbi
      • @abbi:你能试着自己做一个练习吗?
      猜你喜欢
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 1970-01-01
      相关资源
      最近更新 更多