Как я могу извлечь соответствия из оператора соответствия Perl в переменные?

Можно также создать бесплатную функцию в пространстве имен:

В BitParser.h

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex);
}

В BitParser.cpp

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex)
    {
        //get the bit :)
    }
}

В целом это было бы предпочтительным способом записать код. Когда нет никакой потребности в объекте, не используют класс.

15
задан joachim 12 October 2010 в 16:48
поделиться

5 ответов

Уловка состоит в том, чтобы заставить m // работать в контексте списка с помощью назначения списка:

 ($interesting) = $string =~ m/(interesting)/g;

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

 ($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;
34
ответ дан 1 December 2019 в 00:16
поделиться

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

Чтобы извлечь что-то интересное, вам также необходимо каким-то образом закрепить бит, который вы хотите извлечь.

Итак, в вашем примере это сначала обеспечит ввод строка соответствует нашему выражению, а затем извлеките бит между двумя «скучными» битами:

$input = "boring interesting boring";
if($input =~ m/boring (.*) boring/) {
    print "The interesting bit is $1\n";
}
else {
    print "Input not correctly formatted\n";
}
5
ответ дан 1 December 2019 в 00:16
поделиться

$ & - Строка, соответствующая последней успешное совпадение с образцом (не считая любые совпадения, скрытые в БЛОКЕ или eval (), заключенный в текущий БЛОК).

#! /usr/bin/perl

use strict;
use warnings;

my $interesting;
my $string = "boring interesting boring";
$interesting = $& if $string =~ /interesting/;
0
ответ дан 1 December 2019 в 00:16
поделиться

Я нашел ответ на это (из этой страницы ):

Библиотека bigarray реализует большие многомерные числовые массивы. Эти массивы называются «большими массивами», чтобы отличать их от стандартных массивов Caml, описанных в Модульном массиве. Основные различия между «большими массивами» и стандартными массивами Caml заключаются в следующем:

  • Большие массивы не ограничены по размеру, в отличие от массивов Caml (массив с плавающей запятой ограничен 2097151 элементом на 32-битной платформе, другие типы массивов - 4194303 элементов).
  • Большие массивы многомерны. Поддерживается любое количество размеров от 1 до 16. Напротив, массивы Caml являются одномерными и требуют кодирования многомерных массивов как массивов массивов.
  • Большие массивы могут содержать только целые числа и числа с плавающей запятой, тогда как массивы Caml могут содержать произвольные типы данных Caml. Однако, Затем используйте специальные переменные $ 1 , $ 2 и т. Д. Для доступа к захваченной строке.

    if ( m/(interesting)/ ) {
        my $captured = $1;
    }
    
8
ответ дан 1 December 2019 в 00:16
поделиться

Вы можете использовать именованные буферы захвата:

if (/ (?<key> .+? ) \s* : \s* (?<value> .+ ) /x) { 
    $hash{$+{key}} = $+{value};
}
2
ответ дан 1 December 2019 в 00:16
поделиться
Другие вопросы по тегам:

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