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

Необходимо удостовериться, что usercontrol не установил, это - ширина в xaml файле usercontrol. Просто удалите Ширину = "..." от него, и Вы хороши для движения!

РЕДАКТИРОВАНИЕ: Это - код, с которым я протестировал его:

SOUserAnswerTest.xaml:

<UserControl x:Class="WpfApplication1.SOAnswerTest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Name="LeftSideMenu" Width="100"/>
            <ColumnDefinition Name="Middle" Width="*"/>
            <ColumnDefinition Name="RightSideMenu" Width="90"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Column="0">a</TextBlock>
        <TextBlock Grid.Column="1">b</TextBlock>
        <TextBlock Grid.Column="2">c</TextBlock>
    </Grid>
</UserControl>

Window1.xaml:

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="415">
    <Grid>

        <local:SOAnswerTest Grid.Column="0" Grid.Row="5" Grid.ColumnSpan="2"/>
    </Grid>
</Window>
12
задан brian d foy 29 September 2009 в 23:51
поделиться

5 ответов

my @VAR;
push @VAR, [ splice @array, 0, 3 ] while @array;

или вы можете использовать natatime из List :: MoreUtils

use List::MoreUtils qw(natatime);

my @VAR;
{
  my $iter = natatime 3, @array;
  while( my @tmp = $iter->() ){
    push @VAR, \@tmp;
  }
}
30
ответ дан 2 December 2019 в 02:59
поделиться

Или так:

my $VAR;
while( my @list = splice( @array, 0, 3 ) ) {
    push @$VAR, \@list;
}
5
ответ дан 2 December 2019 в 02:59
поделиться

Мне очень нравится List :: MoreUtils, и я часто его использую. Однако мне никогда не нравилась функция natatime . Он не производит вывод, который можно использовать с циклом for или map или grep .

Мне нравится связывать в коде операции map / grep / apply. Как только вы поймете, как работают эти функции, они могут быть очень выразительными и мощными.

Но легко заставить функцию работать как natatime, которая возвращает список ссылок на массив.

sub group_by ($@) {
    my $n     = shift;
    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, [ splice @array, 0, $n ] while @array;

    return @groups;
}

Теперь вы можете делать такие вещи, как:

my @grouped = map [ reverse @$_ ],
              group_by 3, @array;

** Обновите предложения Криса Лутца **

Крис , Я вижу достоинства в предложенном вами добавлении ссылки на код в интерфейс. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Я думаю, что мне больше нравится то, что я написал. изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API. Как только вы поймете, как работают эти функции, они могут быть очень выразительными и мощными.

Но легко заставить функцию работать как natatime, которая возвращает список ссылок на массив.

sub group_by ($@) {
    my $n     = shift;
    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, [ splice @array, 0, $n ] while @array;

    return @groups;
}

Теперь вы можете делать такие вещи, как:

my @grouped = map [ reverse @$_ ],
              group_by 3, @array;

** Обновите предложения Криса Лутца **

Крис , Я вижу достоинства в предложенном вами добавлении ссылки на код в интерфейс. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API. Как только вы поймете, как работают эти функции, они могут быть очень выразительными и мощными.

Но легко заставить функцию работать как natatime, которая возвращает список ссылок на массив.

sub group_by ($@) {
    my $n     = shift;
    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, [ splice @array, 0, $n ] while @array;

    return @groups;
}

Теперь вы можете делать такие вещи, как:

my @grouped = map [ reverse @$_ ],
              group_by 3, @array;

** Обновите предложения Криса Лутца **

Крис , Я вижу достоинства в предложенном вами добавлении ссылки на код в интерфейс. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API.

Но легко заставить функцию работать как natatime, которая возвращает список ссылок на массив.

sub group_by ($@) {
    my $n     = shift;
    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, [ splice @array, 0, $n ] while @array;

    return @groups;
}

Теперь вы можете делать такие вещи, как:

my @grouped = map [ reverse @$_ ],
              group_by 3, @array;

** Обновите предложения Криса Лутца **

Крис , Я вижу достоинства в предложенном вами добавлении ссылки на код в интерфейс. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API.

Но легко заставить функцию работать как natatime, которая возвращает список ссылок на массив.

sub group_by ($@) {
    my $n     = shift;
    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, [ splice @array, 0, $n ] while @array;

    return @groups;
}

Теперь вы можете делать такие вещи, как:

my @grouped = map [ reverse @$_ ],
              group_by 3, @array;

** Обновите предложения Криса Лутца **

Крис , Я вижу достоинства в предложенном вами добавлении ссылки на код в интерфейс. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API. Таким образом, встроено поведение, подобное карте.

# equivalent to my map/group_by above
group_by { [ reverse @_ ] } 3, @array;

Это красиво и лаконично. Но чтобы сохранить прекрасную семантику ссылки кода {} , мы поместили аргумент count 3 в труднодоступное место.

Думаю, мне больше нравится то, что я написал изначально.

Связанная карта не намного более подробна, чем то, что мы получаем с расширенным API. При исходном подходе grep или другую аналогичную функцию можно использовать без необходимости ее повторной реализации.

Например, если ссылка на код добавляется в API, вам необходимо выполнить:

my @result = group_by { $_[0] =~ /foo/ ? [@_] : () } 3, @array;

, чтобы получить эквивалент:

my @result = grep $_->[0] =~ /foo/,
             group_by 3, @array;

Поскольку я предложил это для упрощения цепочки, мне больше нравится оригинал.

Конечно, было бы легко разрешить любую форму:

sub _copy_to_ref { [ @_ ] }

sub group_by ($@) {
    my $code = \&_copy_to_ref;
    my $n = shift;

    if( reftype $n eq 'CODE' ) {
        $code = $n;
        $n = shift;
    }

    my @array = @_;

    croak "group_by count argument must be a non-zero positive integer"
        unless $n > 0 and int($n) == $n;

    my @groups;
    push @groups, $code->(splice @array, 0, $n) while @array;

    return @groups;
}

Теперь любая форма должна работать (непроверено). Я не уверен, нравится ли мне оригинальный API или этот со встроенными возможностями карты.

Кто-нибудь думает?

** Обновлено снова **

Крис прав, указывая, что необязательный версия кода ref вынудила бы пользователей сделать:

group_by sub { foo }, 3, @array;

Что не очень хорошо и противоречит ожиданиям. Поскольку нет способа получить гибкий прототип (о котором я знаю), это ставит крест на расширенном API, и я бы придерживался оригинала.

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

6
ответ дан 2 December 2019 в 02:59
поделиться

Другой ответ (вариант Tore, использующий сплайсинг, но избегающий цикла while в пользу большего количества Perl-y map)

my $result = [ map { [splice(@array, 0, 3)] } (1 .. (scalar(@array) + 2) % 3) ];
5
ответ дан 2 December 2019 в 02:59
поделиться

Попробуйте следующее:

$VAR = [map $_ % 3 == 0 ? ([ $array[$_], $array[$_ + 1], $array[$_ + 2] ]) 
                        : (),
            0..$#array];
3
ответ дан 2 December 2019 в 02:59
поделиться
Другие вопросы по тегам:

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