Как я могу поддержать порядок ключей, которые я добавляю к хешу Perl?

ObjectContext имеет свойство подключения, которое вы можете использовать для управления транзакциями.

using (var context = new BlahEntities())
using (var tx = context.BeginTransaction())
{
    // do db stuff here...
    tx.Commit();
}

В случае исключения транзакция будет отменена. Поскольку вызов BeginTransaction () требует открытого соединения, имеет смысл заключить вызов BeginTransaction, возможно, в метод расширения.

public static DbTransaction BeginTransaction(this ObjectContext context)
{
    if (context.Connection.State != ConnectionState.Open)
    {
        context.Connection.Open();
    }
    return context.Connection.BeginTransaction();
}

Один из сценариев, где я считаю, что этот подход может быть полезен для TransactionScope, - это когда вам нужно получить доступ к двум источникам данных и вам нужен только транзакционный контроль над одним из соединений. Я думаю, что в этом случае TransactionScope будет продвигаться к распределенной транзакции, которая может не потребоваться.

20
задан G. Cito 10 March 2015 в 13:41
поделиться

4 ответа

Хеши не заказываются, но, как обычно, CPAN предлагает решение: Tie :: IxHash

use Tie::IxHash;
my %count;
tie %count, 'Tie::IxHash';

while ($line = <DATA>) {
$count{$line}++ if ( $line =~ /\S/ );
}

while( my( $key, $value)= each %count) {
    print "$key\t $value"; 
}
34
ответ дан 29 November 2019 в 22:37
поделиться

Данные в хэш-таблице хранятся в порядке хэш-кода ключей, который для большинства целей подобен случайному порядку. Вы также хотите сохранить порядок первого появления каждой клавиши. Вот один из способов решения этой проблемы:

my (%count, $line, @display_order);
while ($line = <DATA>) {
    chomp $line;           # strip the \n off the end of $line
    if ($line =~ /\S/) {
        if ($count{$line}++ == 0) {
            # this is the first time we have seen the key "$line"
            push @display_order, $line;
        }
    }
}

# now @display_order holds the keys of %count, in the order of first appearance
foreach my $key (@display_order)
{
    print "$key\t $count{$key}\n";
}
15
ответ дан 29 November 2019 в 22:37
поделиться

Из ответа perlfaq4 на «Как мне заставить свой хеш запоминать порядок, в котором я помещал в него элементы?»


Как я могу сделать свой hash, помните порядок, в котором я помещал в него элементы?

Используйте Tie :: IxHash из CPAN.

use Tie::IxHash;

tie my %myhash, 'Tie::IxHash';

for (my $i=0; $i<20; $i++) {
    $myhash{$i} = 2*$i;
    }

my @keys = keys %myhash;
# @keys = (0,1,2,3,...)
10
ответ дан 29 November 2019 в 22:37
поделиться

Проще говоря:

my (%count, @order);
while(<DATA>) {
  chomp;
  push @order, $_ unless $count{$_}++;
}
print "$_ $count{$_}\n" for @order;
__DATA__
a
b
e
a
c
d
a
c
d
b

Или, как одна строка

perl -nlE'$c{$_}++or$o[@o]=$_}{say"$_ $c{$_}"for@o'<<<$'a\nb\ne\na\nc\nd\na\nc\nd\nb'
6
ответ дан 29 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

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