Как перебрать каждое слово в аргументе для perl - PullRequest
0 голосов
/ 17 февраля 2012

Я хотел бы иметь программу на Perl, которую я могу вызвать с чем-то вроде:

perl myProgram --input="This is a sentence"

А затем Perl распечатает вывод на терминал в этом формате

word1 = This
word2 = is
word3 = a
word4 = sentence

Я обычно программист на c / c ++ / java, но я недавно смотрел на Perl и просто не могу понять это.

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

Использование Getopt :: Long и split .

#!/usr/bin/perl

use strict;
use warnings;
use Getopt::Long;

my $input = '';
GetOptions( 'input=s' => \$input );

my $count = 0;
for (split ' ', $input) {
        printf("word%d = %s\n", ++$count, $_);
}
1 голос
/ 17 февраля 2012

'split' не обрабатывает лишние начальные, конечные и встроенные пробелы. Ваша лучшая ставка - повторное совпадение с непробельными символами, m{\S+}gso.

Первый параметр командной строки - $ARGV[0]. Сложив это вместе, мы имеем:

#! /usr/bin/perl

use strict;
use warnings;

my @words = $ARGV[0] =~ m{\S+}gso;

for (my $i = 0; $i < @words; $i++) {
    print "word", $i + 1, " = ", $words[$i], "\n";
}

(Я итерировал по массиву, используя индекс только потому, что вопрос был изначально сформулирован с точки зрения выдачи возрастающего значения с каждой строкой. Обычно мы хотели бы просто использовать for или foreach для итерации список напрямую.)

Позвонив как:

perl test.pl ' This  is  a  sentence '

печать:

word1 = This
word2 = is
word3 = a
word4 = sentence

Если вы явно хотите получить входные данные для длинного имени опции с двумя тире, используйте Getopt :: Long, как описано Квентином.

1 голос
/ 17 февраля 2012

Пожалуйста, взгляните на perldoc split ().

foreach my $word (split (/ /, 'This is a sentence'))
{
     print "word is $word\n";
}

Редактировать : добавлены круглые скобки вокруг вызова split.

...