Я хочу сделать это на Perl:

>> "foo bar baz".scan /(\w+)/
=> [["foo"], ["bar"], ["baz"]]

Какие-либо предложения?

5
klochner 8 Авг 2009 в 04:21
Это предназначено для размещения общего регулярного выражения, разделенного другими произвольными символами.
 – 
klochner
8 Авг 2009 в 05:41

3 ответа

Лучший ответ

По сути, это то же самое.

my @elem = "foo bar baz" =~ /(\w+)/g

Вы также можете установить «скалярную переменную по умолчанию» $_.

$_ = "foo bar baz";
my @elem = /(\w+)/g;

См. perldoc perlre для получения дополнительной информации.


Если вы хотите использовать эту строку только как массив, вы можете использовать qw().

my @elem = qw"foo bar baz";

См. perldoc perlop (цитаты и операторы, подобные цитатам ).

13
Brad Gilbert 8 Авг 2009 в 04:46
7
IMHO, явное присвоение $_ просто для использования одной из идиом Perl implicit $_ неловко упускает из виду суть этого идиоматического сокращения.
 – 
pilcrow
8 Авг 2009 в 06:21
1
Я знаю, я хочу расширить эту часть ответа, чтобы показать, где это было бы полезно.
 – 
Brad Gilbert
8 Авг 2009 в 06:40

Также разделите, например,

my $x = "foo bar baz";
my @elem = split(' ', $x);

ИЛИ

my @elem = split(/\w+/, $x);

И т.п.

3
Chris Cleeland 8 Авг 2009 в 04:37
Я думаю, вы имеете в виду "split /(\w+)/ ..."
 – 
Brad Gilbert
8 Авг 2009 в 04:39
1
Синан прав, я смотрел на использование сплита, и он не подходит для этой цели. Мне просто нужен массив элементов, соответствующих регулярному выражению.
 – 
klochner
8 Авг 2009 в 05:40
Вы правы, что split ('', ...) неудовлетворительны в более сложных случаях. Это будет работать для представленного тривиального случая. Спасибо, что поймали оплошность на split (/ \ w + /). Я являюсь дополнением OP, где я не знаю Ruby, но знаю Perl и неправильно понимаю функциональность сканирования.
 – 
Chris Cleeland
9 Авг 2009 в 06:59
Split / \ W + /, 'foo bar baz' дает 'foo', 'bar', 'baz' по запросу
 – 
larelogio
10 Авг 2009 в 18:13

Их ключевой концепцией Perl является скалярный контекст против контекста списка. Присвоение выражения массиву приводит к принудительному контексту списка, как и что-то вроде цикла while.

Таким образом, эквивалентом блочной формы String # scan является использование регулярного выражения с циклом while:

while ("foo bar baz" =~ /(\w+)/) {
    my $word = $1;
    do_something_with($word);
}
1
robc 19 Мар 2010 в 02:53