2015-11-03 4 views
0

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

sub addCustomer() 
{ 
    my $tx = new Business::OnlinePayment("USAePay"); 
    $tx->content(
     login   => LOGIN, 
     password  => PASSWORD, 
     type   => "CC", 
     action   => 'Recurring Authorization', 
     description => 'Business::OnlinePayment test', 
     amount   => '49.95', 
     invoice_number => '100100', 
     name   => 'Tofu Beast', 
     card_number => '46464646464646', 
     expiration  => '11/08', 
     address  => '1234 Bean Curd Lane, San Francisco', 
     zip   => '94102', 
    ); 
    $tx->submit(); 

    if($tx->is_success()) { 
     print "Card processed successfully: ".$tx->authorization."\n"; 
    } else { 
     print "Card was rejected: ".$tx->error_message."\n"; 
    } 
} 
+2

Вы должны начать с чтения и поглощая [Подпрограммы Perl] (http://perldoc.perl.org/perlsub.html) и [Perl стиль модуля руководство] (http://perldoc.perl.org /perlmodstyle.html) – Borodin

+0

Возможный дубликат [Аргументы подпрограммы Perl] (http://stackoverflow.com/questions/19234209/perl-subroutine-arguments) –

+0

Не используйте прототипы (круглые скобки в декларации 'sub'). Они не требуются, и они не делают того, что, по вашему мнению, они делают. Они, скорее всего, дадут вам странные ошибки, чем что-либо еще. Они используются, чтобы подпрограммы имитировали встроенные функции, и ничего больше. Ваш должен быть 'sub addCustomer {'. – TLP

ответ

1

Передайте параметры как хэш (или, точнее, как хеш-ссылку).

# Outside of the subroutine 
my %new_customer = (
    login   => LOGIN, 
    password  => PASSWORD, 
    type   => "CC", 
    action   => 'Recurring Authorization', 
    description => 'Business::OnlinePayment test', 
    amount   => '49.95', 
    invoice_number => '100100', 
    name   => 'Tofu Beast', 
    card_number => '46464646464646', 
    expiration  => '11/08', 
    address  => '1234 Bean Curd Lane, San Francisco', 
    zip   => '94102', 
); 

add_customer(\%new_customer); 

# Your subroutine 
sub add_customer { 
    my ($cust_ref) = @_; 

    # Note: Don't use indirect object notation 
    my $tx = Business::OnlinePayment->new("USAePay"); 

    $tx->content(%$cust_ref); 
    $tx->submit(); 

    if ($tx->is_success()) { 
     print "Card processed successfully: ".$tx->authorization."\n"; 
    } else { 
     print "Card was rejected: ".$tx->error_message."\n"; 
    } 
} 
2

Традиционный способ:

addCustomer($number, $firstName, $lastName, $address, $city, $state, $zip); 

sub addCustomer { 
    my ($number, $firstName, $lastName, $address, $city, $state, $zip) = @_; 
    ... 

Для многих параметров, названные параметры могут быть более читаемым:

addCustomer(number  => $number, 
      first_name => $firstName, 
      last_name => $lastName, 
      address => $address, 
      city  => $city, 
      state  => $state, 
      zip  => $zip, 
      ); 

sub addCustomer { 
    my %opts = (city => 'New York', # The defaults. 
       @_); 

В новых версиях Perl (5.20+), вы можете также использовать signaturesfeature.

use feature qw{ signatures }; 

sub addCustomer($number, $firstName, $lastName, $address, $city, $state, $zip) { 

Для пустых параметров используйте undef или q(), если не использовать именованные параметры:

addCustomer(123, q(), 'Doe', '123 Street', 'London', undef, 'WC1A1BN') 
+1

Обратите внимание, что маловероятно, что на другой установке будет доступен Perl v5.20, поэтому, если есть намерение написать что-то портативное, тогда вы должны придерживаться традиционных методов. – Borodin

+0

Зачем использовать 'q()', когда самый простой способ его поместить это '' '' или '' '', то, что все понимают. – TLP

+0

@TLP: [PBP] (https://www.safaribooksonline.com/library/view/perl-best-practices/0596001738/ch04.html) – choroba

2

Вы хотите не сделать это:

sub addCustomer() 

Потому что что прототипы вашего sub не имеют параметров. Вероятно, вы вообще не хотите прототипа, потому что прототипы perl - это не то, что все остальные называют прототипами.

Но вы можете читать args от @_ - это список входных скаляров, которые могут быть ссылками, но не обязательно.

my ($first_arg, $second, $another, @everything_else) = @_; 

Примечание - присваивание список будет потреблять остальные значения, так что вы не можете:

my (@stuff, $last_arg) = @_; 

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

Смежные вопросы