расширение функции разделения - PullRequest
1 голос
/ 11 января 2010

Я изучаю пример кода из функции разделения .

Пример кода.

#!C:\Perl\bin\perl.exe
use strict;
use warnings;

my $info = "Caine:Michael:Actor:14, Leafy Drive";
my @personal = split(/:/, $info);
# @personal = ("Caine", "Michael", "Actor", "14, Leafy Drive");

Если изменить $info = "Caine Michael Actor /* info data */"; Как использовать split(/ /, $info) для экспорта приведенного ниже результата.

# @personal = ("Caine", "Michael", "Actor", "info data");

Спасибо.

Ответы [ 4 ]

4 голосов
/ 11 января 2010

Альтернативный подход:

Рассматривали ли вы использование 3-параметрической версии split:

$info = "Caine Michael Actor /* info data */";
@personal= split(' ',$info,4);

в результате

@personal=('Caine','Michael','Actor','/* info data */');

тогда вам придется удалить / * * / .. чтобы получить результат ...

2 голосов
/ 11 января 2010

Для этого лучше использовать регулярное выражение:

$info = "Caine Michael Actor /* info data */";
$info =~ /(\w+)\s+(\w+)\s+(\w+).*\/\*(.+)\*\//;
@personal = ($1, $2, $3, $4);

Главным образом потому, что в вашей входной строке есть неоднозначности, связанные с разделителями слов, которые нелегко обрабатываются split.

Если вам интересно, как читать регулярные выражения:

/
    (\w+)   # CAPTURE a sequence of one of more word characters into $1
    \s+     # MATCH one or more white space
    (\w+)   # CAPTURE a sequence of one of more word characters into $2
    \s+     # MATCH one or more white space
    (\w+)   # CAPTURE a sequence of one of more word characters into $3
    .*      # MATCH zero or more of anything
    \/\*    # MATCH the opening of C-like comment /*
    (.+)    # CAPTURE a sequence of one or more of anything into $4
    \*\/    # MATCH the closing of C-like comment */
/x
1 голос
/ 12 января 2010

, поскольку пока нет ответа, который обрабатывает общий случай, вот что:

split здесь не лучшая ставка, и, поскольку разделитель может быть как совпадающим, так и несовпадающим символом, будет проще обратить проблему и описать, что вы делаете, что сопоставить, что в данном случае либо строка непробельных символов, либо содержимое комментария в стиле ac.

use strict;
use warnings;

my $info = "Caine Michael Actor /* info data */";
my @personal = grep {defined} $info =~ m! /\* \s* (.+?) \s* \*/ | (\S+) !xg;

say join ', ' => @personal;

, который вернет список слов / содержания комментариев в любой последовательности, которая вам нужна. Подсветка синтаксиса не выделяет вышеупомянутое регулярное выражение должным образом, регулярное выражение - все между !

0 голосов
/ 11 января 2010

что-то приготовили :). Работает только на вашем примере. Невозможно обобщить

use strict;
use warnings;

my $info = "Caine Michael Actor /* info data */";
if($info=~m{/\*\s*(.*?)\s*\*/})
{
    my $temp = $1;
    $temp=~s{\s+}{##}g;
    $info=~s{/\*\s*(.*?)\s*\*/}{$temp};
}
my @personal = split(/ /, $info);
foreach(@personal)
{
    s{##}{ }g;
    print "$_\n";
}

Выход:

C:>perl a.pl
Caine
Michael
Actor
info data
...