Переменная Perl определяет объем вопроса

Можно просто использовать ContentResult для возврата простой строки:

public ActionResult Temp() {
    return Content("Hi there!");
}

ContentResult значением по умолчанию возвращается text/plain как contentType. Это сверхзагружаемо, таким образом, можно также сделать:

return Content("This is poorly formatted xml.", "text/xml");

7
задан Chris Lutz 24 August 2009 в 23:55
поделиться

3 ответа

Ну, два других ответа наполовину правы. Вот рабочее решение, которое на самом деле сортирует:

package Foo;

use strict;
use warnings;

sub sort {
    my ($self, $sub) = @_;

    my ($pkg) = caller;
    my @x = qw(1 6 39 2 5);
    print "@x\n";
    {
        no strict 'refs';
        @x = sort {
            local (${$pkg.'::a'}, ${$pkg.'::b'}) = ($a, $b);
            $sub->();
        } @x;
    }
    print "@x\n";

    return;
}


package main;

use strict;
use warnings;

my $foo = {};
bless $foo, 'Foo';

$foo->sort(sub { $a <=> $b });
# 1 6 39 2 5
# 1 2 5 6 39

Предположительно, вы должны отсортировать некоторые данные, которые на самом деле являются частью объекта.

Вам нужна магия вызывающего , чтобы вы локализовали $ a и $ b в пакете вызывающей стороны, где Perl будет их искать. Он создает глобальные переменные, которые существуют только во время вызова этой подпрограммы.

Обратите внимание, что вы получите «имя используется только один раз» с предупреждениями ; Я уверен, что есть некоторые обручи, через которые вы можете каким-то образом избежать этого.

9
ответ дан 6 December 2019 в 15:24
поделиться

Вы можете использовать локальный оператор для установки значений для $ a и $ b на время вызова подпрограммы:

sub sample
{
    my $callback = shift;
    for (my $i = 0; $i < @_; $i += 2) {
        local ($a, $b) = @_[$i, $i + 1];
        $callback->();
    }
}       

sample sub { print "$a $b\n" }, qw(a b c d e f g h i j);

Если у вас есть обычная подпрограмма, а не метод, вы можете сделайте его еще более похожим на sort , чтобы вы не Нет необходимости использовать sub перед функцией обратного вызова. Используйте прототип функции:

sub sample (&@)

Затем вы вызываете ее так:

sample { print "$a $b\n" } qw(a b c d e f g h i j);

Однако на методы не влияют прототипы.

1
ответ дан 6 December 2019 в 15:24
поделиться

Вы можете использовать Sub :: Identify , чтобы узнать пакет (который он называет stash_name ), связанный с coderef. Затем установите $ a и $ b в этом пакете по мере необходимости. Возможно, вам придется использовать в методе no strict 'refs' , чтобы это работало.

Вот Evee ' ответ изменен для работы в общем случае:

use strict;
use warnings;

package Foo;

use Sub::Identify 'stash_name';

sub sort {
    my ($self, $sub) = @_;

    my $pkg = stash_name($sub);
    my @x = qw(1 6 39 2 5);
    print "@x\n";
    {
        no strict 'refs';
        @x = sort {
            local (${$pkg.'::a'}, ${$pkg.'::b'}) = ($a, $b);
            $sub->();
        } @x;
    }
    print "@x\n";

    return;
}


package Sorter;

sub compare { $a <=> $b }

package main;

use strict;
use warnings;

my $foo = {};
bless $foo, 'Foo';

$foo->sort(\&Sorter::compare );

$foo->sort(sub { $b <=> $a });
4
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

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