Perl: удаление символов до определенной точки. - PullRequest
1 голос
/ 21 октября 2011

Я пытался найти ответы на уже заданные вопросы, но, похоже, ничего не нашел. Я уверен, что это невероятно просто сделать, но я совершенно новичок в Perl.

Что я пытаюсь сделать, это удалить символы в строке до определенной точки. Например, у меня есть:

Параметр1: 0xFFFF

и что я хотел бы сделать, это удалить «Parameter1:» и оставить только «0xFFFF». Если кто-то может помочь и дать простое объяснение используемых операторов, это было бы здорово.

Ответы [ 4 ]

2 голосов
/ 21 октября 2011

Похоже, вам нужна функция substr .

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

  my $string = 'Parameter1 : 0xFFFF';
  my $fragment =  substr $string, 12;
  print "  string: <$string>\n";
  print "fragment: <$fragment>\n";
1 голос
/ 21 октября 2011

Мне нравится разделение для этих пар параметр / значение.

my $str = "Parameter1 : 0xFFFF";
my ($param, $value) = split /\s*:\s*/, $str, 2;

Обратите внимание на использование LIMIT в разделении, которое ограничивает разделение двумя полями (в случае дополнительных двоеточий в значении).

1 голос
/ 21 октября 2011

Рассматривали ли вы использовать что-то вроде Config :: Std ?

Вот как вручную разобрать файл конфигурации:

#!/usr/bin/perl

use strict; use warnings;

my %params;

while ( my $line = <DATA> ) {
    if ($line =~ m{
            ^
            (?<param> Parameter[0-9]+)
            \s*? : \s*?
            (?<value> 0x[[:xdigit:]]+)
        }x ) {
        $params{ $+{param} } = $+{value};
    }
}

use YAML;
print Dump \%params;

__DATA__
Parameter1 : 0xFFFF
Parameter3 : 0xFAFF
Parameter4 : 0xCAFE

С Config::Std:

#!/usr/bin/perl

use strict; use warnings;
use Config::Std;

my $config = do { local $/; <DATA> };

read_config \$config, my %params;

use YAML;
print Dump \%params;

__DATA__
Parameter1 : 0xFFFF
Parameter3 : 0xFAFF
Parameter4 : 0xCAFE

Конечно, в реальной жизни вы бы передавали имя файла в read_config вместо того, чтобы хлестать его.

1 голос
/ 21 октября 2011
s/.*:\s*//;

или

$s =~ s/.*:\s*//;

Это удаляет все, вплоть до первого вхождения :, за которым следует ноль или более пробельных символов.С $s =~ он применяется к $s;без него применяется к $_.

...