Советы по Perl - принятие в файл и изменение содержимого - PullRequest
3 голосов
/ 18 августа 2011

У меня есть запрос на несколько советов о том, как подойти к этому сценарию, который я хочу написать на Perl.По сути, у меня есть файл, который выглядит следующим образом:

  id: 1
  Relationship: ""
  name: shelby
  pet: 1
  color:4

Есть определенные ключевые слова, такие как питомец и цвет, которые имеют чисел после этого.Я хочу иметь возможность взять файл и найти эти ключевые слова (их 5 или 6), а затем изменить число на слово, которому соответствует число.То есть для ключевого слова "домашнее животное" ---> 0 = собака, 1 = кошка, 2 = рыба.А для ключевого слова «цвет» 0 = красный, 1 = синий, 2 = фиолетовый, 3 = коричневый, 4 = белый.Скрипт должен найти и изменить эти цифры.Целью должен быть выходной файл, который выглядит следующим образом:

      id: 1
      Relationship: ""
      name: shelby
      pet: cat
      color:white

Я некоторое время боролся с тем, как это сделать.Я посмотрел в Интернете, может быть, я мог бы сделать массив хэшей или что-то в этом роде, но я относительно новичок в Perl и не знаю точно, как даже подойти к этой проблеме .... Любой совет будет высоко оценен!

Спасибо

Ответы [ 5 ]

2 голосов
/ 18 августа 2011

Если мы говорим о небольшом наборе значений, у вас может быть хэш массивов:

%lookups = ( pet => [ "dog", "cat", "fish" ],
             color => [ "red", "blue", "purple", "brown", "white" ] );

Затем, когда вы читаете файл, проверьте каждое ключевое слово по хешу. Если в нем есть ключ с этим ключевым словом, замените значение в строке, которую вы прочитали, значением из хэша.

0 голосов
/ 18 августа 2011

Использование: script.pl file.txt > output.txt

use strict;
use warnings;

my %tags = (
    "pet" => [ qw(dog cat fish) ],
    "color" => [ qw(red blue purple brown white) ],
);

my $rx = join '|', keys %tags;

while (<>) {
    s/^\s*($rx):\s*(\d+)/$1: $tags{$1}[$2]/;
    print;
}
0 голосов
/ 18 августа 2011

Используя предложение zigdon

#!/usr/bin/perl
use strict;
use warnings;
use 5.014;

my %param = (pet   => [qw/dog cat fish/],
             color => [qw/ red blue purple brown white/],
);

while (<DATA>) {
    if (/^(pet|color):\s*(\d)$/) {
        print "$1: $param{ $1 }[$2]\n";
    }
    else {
        print;  
    }
}


__DATA__
id: 1
Relationship: ""
name: shelby
pet: 1
color:4
0 голосов
/ 18 августа 2011

Если дел не так много, вы можете попробовать что-то вроде этого для запуска с perl -p:

if (/^id/) 
{
    s/\d+/%h=(1=>"dog",2=>"warf",3=>"ee");$h{$&}/e;
}
if (/^other/) 
{ 
    s/\d+/%h=(1=>"other_thing",3=>"etc",4=>"etc2");$h{$&}/e;
}

РЕДАКТИРОВАТЬ:

Для автоматизациитесты, вы можете сделать что-то вроде (также принимая идею хэшей из zigdon):

my @interesting_tags = ("color", "pet");
my $regexp = "(" .  join("|" , @interesting_tags) . ")";

my %lookups = ( pet => [ "dog", "cat", "fish" ],
                color => [ "red", "blue", "purple", "brown", "white" ] );


while (<>)
{
    if (/$regexp/)
    {
        my $element = $&;
        s/\d+/$lookups{$element}[$&]/e;
    }
}
0 голосов
/ 18 августа 2011

Это должно сделать это

use strict;

my $inputFileName = 'E:\test.txt';
my $outputFileName = 'E:\test2.txt';


my %Colors = ( 1 => 'Red' , 2 => 'Green' , 4 => 'Blue' );
my %Pets = ( 1 => 'Dog' , 2 => 'Cat' );

open( IN , "<" , $inputFileName) or die "$inputFileName could not be opened $!";
open( OUT, ">" , $outputFileName) or die "$outputFileName could not be opened $!";

while(<IN>)
{
    my $line = $_;
    if (/^(\s*pet\s*:\s*)(\d+)/ )
    {
        $line = $1. $Pets{$2} . "\n";
    }
    elsif (/\s*^color\s*:\s*(\d+)/ )
    {
       $line = $1. $Colors{$2} . "\n";
    }

    print OUT $line;
}
close(IN);
close(OUT);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...