1

我有一个包含abc.txt 表单数据的文件

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

我想Arun使用sHostPerl 等等。我的代码:

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 很陌生。

4

4 回答 4

2

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

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

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

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

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

然后 $value{'sHost'} 将是“Arun”等

于 2013-03-11T09:51:53.503 回答
1

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

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

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

于 2013-03-12T10:45:11.843 回答
0

使用m/.*=\s*([^\s]*)/g而不是m/sHost/

使用print $1而不是print $row

于 2013-03-11T09:48:38.040 回答
-1

代替

if ($row=~m/sHost/)

if ($row=~s/sHost//)
于 2013-03-11T09:47:25.757 回答