Perl имеет что-то подобным константе PHP ()?

При доступе к простой HTML-форме она должна быть отправлена серверу через кнопку отправки (или с помощью сообщения JavaScript). Это обычно означает, что Ваше определение формы будет похоже на это (я ухожу памяти, удостоверьтесь, что Вы проверяете, что элементы HTML корректны):

<form method="POST" action="page.aspx">

<input id="customerName" name="customerName" type="Text" />
<input id="customerPhone" name="customerPhone" type="Text" />
<input value="Save" type="Submit" />

</form>

необходимо быть в состоянии получить доступ к customerName и customerPhone данным как это:

string n = String.Format("{0}", Request.Form["customerName"]);

, Если Вы имеете method="GET" в форме (не рекомендуемый, она портит Ваше пространство URL), необходимо будет получить доступ к данным формы как это:

string n = String.Format("{0}", Request.QueryString["customerName"]);

Это, конечно, будет только работать, если форма была 'Отправлена', 'Отправлена', или сделана через 'Обратную передачу'. (т.е. кто-то нажал кнопку 'Save', или это было сделано программно с помощью JavaScript.)

кроме того, имейте в виду, что доступ к этим элементам этим способом может только быть сделан, когда Вы не используете управление сервером (т.е. runat="server") с управлением сервером, идентификатор и имя отличаются.

5
задан Sinan Ünür 6 October 2009 в 21:58
поделиться

7 ответов

Что не так с Только для чтения ?

Если он слишком медленный, вы можете дополнить его Только для чтения: XS . Но если вам не нравится Readonly , всегда есть более старая константа .

use constant PI => 3.14159265;

Просто помните,

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

     use constant { PI => 3,14159265
     , E => 2,71828183
     };
    

Из вашего примера:

Судя по вашему примеру, нет причин, по которым хэш только для чтения не мог сделать то же самое.

Readonly::Hash my %field_example => { L => 25, O => 345 };

Затем вы можете использовать его везде, где хотите создать константу:

print "The example is $field_example{$var}\n";

ИЛИ вы можете сделать это так:

Readonly::Hash my %field 
    => { example => { L => 25,     O => 345 }
       , name    => { L => 'Lion', O => 'ocelot' }
       };

И назовите это так:

$field{$var}{L};

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

Cognate to PHP константа

Однако, если вы хотите сделать это таким образом, то я предлагаю сделать то же самое с помощью следующей подпрограммы (и избегает eval ):

sub read_constant { 
    use Symbol qw<qualify_to_ref>;
    my $name = join( '', @_ ); # no need to concatenate before passing
    my $constant;
    # use the first that works: calling package and then "" (main)
    for my $pkg ( scalar( caller ), "" ) { 
        # get symbol reference
        my $symb_ref = qualify_to_ref( $name, $pkg );
        # get the code slot
        $constant    = *{$symb_ref}{CODE};
        last if $constant;
    }
    return unless $constant;
    # call the sub named
    return $constant->();
}

Вы бы назвали это так:

$value = read_constant( 'FIELD_', $var, 'L' );

И последнее: вы можете даже поставить тест, чтобы убедиться, что это только строка, состоящая только из заглавных букв:

Carp::croak "Invalid constant name '$name'" if $name =~ /[^\p{UpperCase}_]/;
15
ответ дан 18 December 2019 в 05:23
поделиться

Вы можете использовать константу .

use constant PI    => 4 * atan2(1, 1);
use constant DEBUG => 0;

print "Pi equals ", PI, "...\n" if DEBUG;

use constant {
    SEC   => 0,
    MIN   => 1,
    HOUR  => 2,
    MDAY  => 3,
    MON   => 4,
    YEAR  => 5,
    WDAY  => 6,
    YDAY  => 7,
    ISDST => 8,
};

use constant WEEKDAYS => qw(
    Sunday Monday Tuesday Wednesday Thursday Friday Saturday
);

print "Today is ", (WEEKDAYS)[ (localtime)[WDAY] ], ".\n";

Или вы можете использовать Readonly .

use Readonly;

# Read-only scalar
Readonly::Scalar     $sca => $initial_value;
Readonly::Scalar  my $sca => $initial_value;

# Read-only array
Readonly::Array      @arr => @values;
Readonly::Array   my @arr => @values;

# Read-only hash
Readonly::Hash       %has => (key => value, key => value, ...);
Readonly::Hash    my %has => (key => value, key => value, ...);
# or:
Readonly::Hash       %has => {key => value, key => value, ...};

# You can use the read-only variables like any regular variables:
print $sca;
$something = $sca + $arr[2];
next if $has{$some_key};

# But if you try to modify a value, your program will die:
$sca = 7;
push @arr, 'seven';
delete $has{key};
# The error message is "Modification of a read-only value attempted"
10
ответ дан 18 December 2019 в 05:23
поделиться
7
ответ дан 18 December 2019 в 05:23
поделиться

Вот функция константы , которую вы ищете:

sub constant
{
  no strict 'refs';
  shift->();                    # Call the supplied function by name
} # end constant

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

Вот более продвинутая, которая все еще работает, даже если вы вызываете ее из другого пакета:

sub constant
{
  my $constant = shift;
  $constant = caller() . "::$constant" unless $constant =~ /::/;
  no strict 'refs';
  $constant->();                # Call function by name
} # end constant
4
ответ дан 18 December 2019 в 05:23
поделиться

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

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

Глядя на опубликованный вами образец кода, я понимаю, что вы, возможно, ищете Hash :: Util :: lock_hash и друзей:

#!/usr/bin/perl

use strict;
use warnings;

use Hash::Util qw(lock_hash);

my %constant = (
    FIELD_EXAMPLE_O => 345,
    FIELD_EXAMPLE_L => 25,
);

lock_hash %constant;

my $var = 'EXAMPLE';

print $constant{"FIELD_${var}_L"}, "\n";

Вывод:

C:\Temp> xuk
25
1
ответ дан 18 December 2019 в 05:23
поделиться

Используйте этот формат:

use constant DFLT_MIN_LENGTH_PWD => 6;
0
ответ дан 18 December 2019 в 05:23
поделиться
Другие вопросы по тегам:

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