Perl, эквивалентный из (Python-), перечисляет понимание

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

Вы будете наслаждаться преимущества, связанные с внешними ключами :

  • Принятие надлежащего дизайна отношений, ограничения внешнего ключа делают более трудным для программиста ввести несоответствие в базу данных.
  • Централизация проверки этих ограничений сервером базы данных делает ненужным выполнить эти проверки на стороне приложения. Это устраняет возможность, что различные приложения не могут проверочные ограничения таким же образом.
  • Используя расположение каскадом обновлений и удаляет, может упростить код приложения.
  • Правильно разработанный внешний ключ управляет помощью в документировании отношений между таблицами.

недостатки:

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

13
задан conny 10 July 2009 в 23:39
поделиться

3 ответа

I think you want grep:

#!/usr/bin/env perl
use strict;
use warnings;

my %data = ( A => undef, B => 'yes', C => undef );

my @keys = grep { defined $data{$_} } keys %data;

print "Key: $_\n" for @keys;

I also think that I type too slowly, and that I should reload the page before posting answers. By the way, either a value of 0 or undef can be a good way to handle null values, but make sure you remember which you're using. A false value and and undefined value aren't the same thing in Perl. To clarify: undef returns false in a boolean test, but so does 0. If 0 is a valid value, then you want to explicitly test for definedness, not simply truth. (I mention it because James went for 0 and I went the other way, and you may or may not know if it matters.)

21
ответ дан 1 December 2019 в 18:55
поделиться

Use grep:

#!/usr/bin/perl

use strict;
use warnings;

my %data = ("A" => 0, "B" => "yes", "C" => 0 );
my @keys = grep { $data{$_} } keys %data;

Grep returns the values from the list on the right-hand side for which the expression in braces evaluates to a true value. As telemachus points out, you want to make sure you understand true/false values in Perl. This question has a good overview of truth in Perl.

You'll likely want a look at map, which applies an expression in braces to each element of a list and returns the result. An example would be:

my @data = ("A" => 0, "B" => 1, "C" => 0 );
my @modified_data = map { $data{$_} + 1 } @data;
print join ' ', @data, "\n";
print join ' ', @modified_data, "\n";
13
ответ дан 1 December 2019 в 18:55
поделиться

Для изменения в теме см. autobox (см. его реализации autobox :: Core и Moose :: Autobox )

use autobox::Core;

my %data = ( A => undef, B => 'yes', C => undef );
my $key_list = %data->keys->grep( sub { defined $data{$_} } );

say "Key: $_" for @$key_list;

# => Key: B


Moose :: Autobox поставляется с ключом / значение 'kv', которое делает код DRYer:

my $key_list = %data->kv->grep( sub{ defined $_->[1] } )->map( sub{ $_->[0] } );

Вот более явная и даже более длинная версия вышеизложенного:

my $key_list = %data->kv
                    ->grep( sub { my ($k, $v) = @$_; defined $v } )
                    ->map(  sub { my ($k, $v) = @$_; $k }         );
6
ответ дан 1 December 2019 в 18:55
поделиться