Perl: Захват энного и mth разграничил слова от каждой строки в файле

Просто используйте

fileLabel.setPreferredSize(new Dimension(100, 40));

Вместо

fileLabel.setMaximumSize(new Dimension(100, 40));

этот установщик сообщает, какой размер должен использоваться для этого компонента, когда он помещен в контейнер с менеджером макета

7
задан ray 1 October 2008 в 19:53
поделиться

6 ответов

Острота является большой, если Вы не пишете больше Perl для обработки результата.

В более общем плане, хотя, в контексте большей программы Perl, Вы или записали бы пользовательское регулярное выражение, например:

if($line =~ m/(\S+)\s+(\S+)/) {
     $ip = $1;
     $hostname = $2;
}

... или Вы использовали бы оператор разделения.

my @arr = split(/ /, $line);
$ip = $arr[0];
$hostname = $arr[1];

Так или иначе добавьте логику для проверки на недопустимый вход.

8
ответ дан 6 December 2019 в 05:49
поделиться

Простая острота

perl -nae 'print "$F[0] $F[1]\n";'

можно изменить разделитель с -F

6
ответ дан 6 December 2019 в 05:49
поделиться

David Nehme сказал:

perl -nae 'print "$F[0] $F[1}\n";

который использует -a переключатель. Я должен был искать тот:

-a   turns on autosplit mode when used with a -n or -p.  An implicit split
     command to the @F array is done as the first thing inside the implicit
     while loop produced by the -n or -p.

Вы изучаете что-то каждый день.-n заставляет каждую строку быть переданной

LINE:
    while (<>) {
        ...             # your program goes here
    }

И наконец -e способ непосредственно ввести одну строку программы. У Вас могут быть больше, чем -e. Большая часть из этого была разрывом perlrun(1) страница справочника.

4
ответ дан 6 December 2019 в 05:49
поделиться

Вот общее решение (если мы ступаем далеко от игры в гольф кода немного).

#!/usr/bin/perl -n
chop;                     # strip newline (in case next line doesn't strip it)
s/#.*//;                  # strip comments
next unless /\S/;         # don't process line if it has nothing (left)
@fields = (split)[0,1];   # split line, and get wanted fields
print join(' ', @fields), "\n";

Обычно split разделения пробелом. Если это не то, что Вы хотите (например, анализируя /etc/passwd), можно передать разделитель как regex:

@fields = (split /:/)[0,2,4..6];

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

7
ответ дан 6 December 2019 в 05:49
поделиться

Давайте превратим это в гольф кода! На основе превосходного ответа David, здесь является моим:

perl -ane 'print "@F[0,1]\n";'

Править: Реальное представление гольфа больше походило бы на это (бритье пяти штрихов):

perl -ape '$_="@F[0,1]
"'

но это менее читаемо в целях этого вопроса.:-P

7
ответ дан 6 December 2019 в 05:49
поделиться

Начиная с луча, который спрашивают, я думал, что перепишу свою целую программу, не используя неявность Perl (кроме использования <ARGV>; это трудно выписать вручную). Это, вероятно, сделает людей Python более счастливыми (фигурные скобки, несмотря на это, :-P):

while (my $line = <ARGV>) {
    chop $line;
    $line =~ s/#.*//;
    next unless $line =~ /\S/;
    @fields = (split ' ', $line)[0,1];
    print join(' ', @fields), "\n";
}

Есть ли что-нибудь, что я пропустил? Надо надеяться, нет. ARGV дескриптор файла является особенным. Это заставляет каждый именованный файл на командной строке быть считанным, если ни один не указан, в этом случае это читает стандартный вход.

Править: О, я забыл. split ' ' является волшебным также, в отличие от этого split / /. Последний просто соответствует пространству. Бывшие соответствия любое количество любого пробела. Это волшебное поведение используется по умолчанию, если никакой шаблон не указан для split. (Некоторые сказали бы, но что относительно /\s+/? ' ' и /\s+/ подобны, за исключением того, как пробел в начале строки рассматривают. Так ' ' действительно является волшебным.)

Мораль истории, Perl является большим, если Вам нравится большое волшебное поведение. Если у Вас нет панели его, используйте Python.:-P

0
ответ дан 6 December 2019 в 05:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: