【问题标题】:Reading Data from a file in PerlPerl 从文件中读取数据
【发布时间】:2013-03-12 18:45:11
【问题描述】:

我有一个文件abc.txt,其中包含表单数据

sHost = "Arun";
sUid ="Abc";

我想使用 Perl 为 sHost 获取 Arun 等等。我的代码:

my $filename = "abc.txt";

use strict;
use warnings;

open(my $fh, '<:encoding(UTF-8)', $filename)
  or die "Could not open file '$filename' $!";

while (my $row = <$fh>)
{
  chomp $row;
  if ($row=~m/sHost/)
  {
    print $row;
  }
}

我得到的输出sHost = Arun;

但我只想要'Arun'。我应该在这里应用什么逻辑?我对 Perl 和 Linux 很陌生。

【问题讨论】:

    标签: perl


    【解决方案1】:

    在 chomp 之后,更改为这个变量 $host 将包含该值

    if ($row=~m/sHost = "(.*)"/) {
      $host=$1;
    

    简单来说,如果有匹配项,则将 ( ) 部分赋予 $1。有关详细信息,请参见 man perlre

    要将其概括为读取任何键和任何值,请执行以下操作

     while (my $row = <$fh>) {
       if ($row = ~ /^(\w+) = "([^"]+)"/) {
         $value{$1} = $2;
       }
    

    那么 $value{'sHost'} 将是“Arun”等

    【讨论】:

      【解决方案2】:

      对于通用配置文件解析,您可以使用以下代码:

      my %config;
      if ($row =~ m/^\s*(["'`])?(\S+)\1?\s*=\s*(["'`])?(\S+?)\3?;?$/) {
          my $key       = $2;
          my $value     = $4;
          $config{$key} = $value;
      }
      

      此正则表达式允许您处理带有普通引号或被不同引号类型包围的键值行(" ' `,但您可以根据需要添加符号)带有前导或/的键/值和尾随空格,分号不是强制性的。您也可以根据您对键/值可能值的要求更改 (\S+)(\S - 除空格外的所有内容)。

      【讨论】:

        【解决方案3】:

        使用m/.*=\s*([^\s]*)/g 代替m/sHost/

        使用print $1 而不是print $row

        【讨论】:

          【解决方案4】:

          替换

          if ($row=~m/sHost/)
          

          if ($row=~s/sHost//)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-05
            • 2011-08-27
            • 1970-01-01
            相关资源
            最近更新 更多