从Perl中的文件读取数据

时间:2013-03-11 09:42:40

标签: perl

我有一个文件abc.txt,其中包含

形式的数据
sHost = "Arun";
sUid ="Abc";

我想使用Perl获取ArunsHost等等。我的代码:

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 个答案:

答案 0 :(得分:2)

在chomp之后,改为this并且变量$ host将包含值

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

简单来说,如果匹配,则()部分为$ 1。有关详细信息,请参阅man perlre

将此概括为读取任何键,任何值都可以执行此类操作

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

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

答案 1 :(得分:1)

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

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

此正则表达式允许您处理带有普通键或由不同报价类型包围的键值行(“'`,但如果您愿意,可以添加符号)键/值带前导或/和尾随空格,分号不是强制性的。你也可以根据你对键/值可能值的要求改变(\ S +)(\ S - 除了空格之外的所有值)。

答案 2 :(得分:0)

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

使用print $1代替print $row

答案 3 :(得分:-1)

替换

if ($row=~m/sHost/)

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