Friday 30 June 2017

Tesouraria Forex Cartão Taxas Icici Bank


Forexclick - Compre Forex Online Usando Forexclick, você pode comprar o Travel Card ou Foreign Currency com o clique de um botão e entregá-lo à sua porta. Você também pode recarregar seu cartão de viagem on-the-go. Com taxas competitivas e disponibilidade 24X7, oferecemos-lhe uma solução de forex sem problemas para suas viagens internacionais. Benefícios da compra Forex Online: Serviço on-the-go com conveniência e segurança Entrega gratuita em casa Serviço disponível 24X7 Taxas preferenciais Documentação fácil e sem complicações Passos simples para comprar Forex ou cartão de viagem Recarregar online: Forneça seus detalhes de entrega pessoal, de viagem e forex Insira o montante de Forex exigido e pague através do ICICI Bank Internet Banking Para entrega de Forex à sua porta, entregando os documentos necessários no momento da entrega. O cartão de viagem será carregado em um dia útil após a recepção do documento na filial. Forneça seus detalhes de entrega pessoal, de viagem e forex Digite o valor do Forex e pague através do ICICI Bank Internet Banking Para entrega de Forex à sua porta, entregando os documentos necessários no momento da entrega. O cartão de viagem será carregado em um dia útil após a recepção do documento na filial. Serviços Instantâneos Serviços de Câmbio - Notas Importantes Atualmente, a entrega dos produtos forex está disponível apenas em Bangalore, Chennai, Delhi, Hyderabad, Mumbai, Pune, Ahmedabad, Baroda, Gurgaon, Noida, Chandigarh e Kolkata. Mantenha seu número de passaporte, data de expiração do passaporte e cartão de débito acessível ao fazer uma solicitação on-line. Por favor, coloque seu pedido de compra on-line e entrega em domicílio de notas de moeda estrangeira, Travellers Checks amp Travel Card pelo menos 3 dias úteis antes da data de viagem. Para qualquer requisito urgente, visite nossa filial mais próxima que oferece serviços Forex. Para a lista de agências, clique aqui. Nosso representante enviará o Forex para você no prazo de 2 dias úteis: Passaporte original precisa ser exibido para verificação física no momento da entrega. Uma cópia do Passaporte a ser enviado no momento da entrega. A pessoa que coloca o pedido precisa estar fisicamente presente no local de entrega. Formulários requisitados a serem preenchidos e assinados no momento da entrega forex. Caso a transação seja cancelada por você, a perda diferencial aplicável decorrente da flutuação das taxas forex será deduzida da Montante reembolsado para sua conta. Lucro se algum não for transferido para você. Os clientes da NRI não podem comprar cartões de viagem, Travelers Cheques ou notas de moeda estrangeira na Índia. Por favor, guarde a cópia da factura de vendas enquanto viaja para o exterior. A instalação não é aplicável para usuários de grupo fechados e transações de terceiros. A Conta de poupança bancária da ICICI usada para recarga on-line deve pertencer apenas ao cliente do cartão de viagem. Clique aqui para termos Termos do amplificador Para assistência, solicite um retorno de chamada Nossa ligação de saída é restrita apenas a Índia. Para consulta, ligue-nos no nosso atendimento ao cliente ou nos nossos números internacionais 24x7. Internet Banking Explore o poder de um banco mais simples e inteligente. Banco on-line com mais de 250 serviços de Banco de Banca Móvel em movimento com nossos serviços de Banca Móvel. Baixe o aplicativo ou use o SMS Pockets pela carteira de pagamento Universal ICICI Bank VISA. Faça o download hoje Encontre o ATMBranch Bank 247 através de uma rede generalizada de mais de 4.501 agências e 14.146 ATMsForex Services na Índia - Compre Forex ou envie dinheiro no exterior Se você estiver viajando para o exterior, pode aproveitar nossos serviços de ampliação de produtos forex que lhe proporcionam uma mistura certa de facilidade De uso e segurança. Nós também oferecemos uma maneira conveniente e segura de transferir seu dinheiro para o exterior para seus amigos e familiares através de nossos serviços de remessa online. Então, sente-se e relaxe, porque agora você pode comprar forex ou enviar dinheiro no exterior instantaneamente. Um cartão pode ser carregado com 15 principais moedas globais - USD, EURO, GBP, CAD, AUD, CHF, JPY, SGD, AED, SEK, ZAR, SAR, THB, NZD e HKD Instalação de recarregamento remoto enquanto viaja no exterior Chip E cartão ativado por Pin para segurança aprimorada Alertas de SMS e e-mail em tempo real para cada transação As notas de moedas em várias denominações podem ser transportadas pelos viajantes para atender às pequenas despesas Oferecidas em 14 moedas USD, EUR, GBP, AUD, CAD, CHF, JPY, AED, SGD, HKD, QAR, SAR, THB e KWD As notas de moedas em várias denominações podem ser transportadas pelos viajantes para atender às pequenas despesas Oferecidas em 14 moedas USD, EUR, GBP, AUD, CAD, CHF, JPY, AED, SGD, HKD , QAR, SAR, THB e KWD Envie dinheiro no exterior Envie dinheiro no exterior Para assistência, solicite um retorno de chamada Nossa ligação de saída é restrita apenas a Índia. Para consulta, ligue-nos no nosso atendimento ao cliente ou nos nossos números internacionais 24x7. Transferir dinheiro em todo o mundo através de transferência bancária ou Demanda de moeda estrangeira Rascunho Fornecimento simples, confiável e rápido para enviar dinheiro fora da Índia Oferecido em 16 moedas: USD, EUR, GBP, AUD, CAD, SGD, JPY, CHF, SEK, DKK, NOK , AED, HKD, QAR, SAR e NZD Transfere online a qualquer hora, em qualquer lugar, os titulares de contas bancárias residentes da ICICI podem selecionar a guia Transferir no exterior no exterior na seção registrada, clique aqui para continuar. Transferir dinheiro em todo o mundo através de transferência bancária ou Demanda de moeda estrangeira Rascunho Fornecimento simples, confiável e rápido para enviar dinheiro fora da Índia Oferecido em 16 moedas: USD, EUR, GBP, AUD, CAD, SGD, JPY, CHF, SEK, DKK, NOK , AED, HKD, QAR, SAR e NZD Transfere online a qualquer hora, em qualquer lugar, os titulares de contas bancárias residentes da ICICI podem selecionar a guia Transferir no exterior no exterior na seção registrada, clique aqui para continuar. Para assistência, solicite uma chamada de volta Nossa chamada de saída é restrita apenas a Índia. Para consulta, ligue-nos no nosso atendimento ao cliente ou nos nossos números internacionais 24x7. Como comprar o Forex Online: compre o Forex Online e obtenha a entrega da porta. Clique aqui para saber mais o aplicativo iMobile: agora você pode fazer uma solicitação de serviço para aproveitar os serviços forex no aplicativo ICICI Bank iMobile. Clique aqui para saber mais. Filiais Forex: para comprar Forex de nossas agências, clique aqui e localize nossas agências Forex. SMS: para comprar Forex, SMS FOREX para 5676766. Internet Banking Explore o poder de um banco mais simples e inteligente. Banco on-line com mais de 250 serviços de Banco de Banca Móvel em movimento com nossos serviços de Banca Móvel. Baixe o aplicativo ou use o SMS Pockets pela carteira de pagamento Universal ICICI Bank VISA. Faça o download hoje Encontre o ATMBranch Bank 247 através de uma ampla rede de mais de 4.501 agências e 14.146 ATMsTravel Money Detalhes do Produto Obtenha taxas de câmbio atraentes, entrega em domicílio e garantia de serviço quando você compra dinheiro de viagem do ICICI Bank. Taxas de câmbio atraentes Taxas de câmbio atrativas em moedas estrangeiras para mais de 60 países e cheques de viagem em cinco principais moedas estrangeiras. Nenhuma comissão em todas as ordens de moeda estrangeira. Compensação Ordem de dinheiro de viagem online ou visitando qualquer uma das nossas agências no Reino Unido. Entrega de casa no próximo dia útil em entrega em ordens de juros de viagem acima da pound700 colocada antes das 2:30 p. m. Uma taxa de manuseio de pound5 aplica-se nas ordens abaixo da libra700. Pagar com cartão de débito ou cartão de crédito para pedidos on-line. Se você paga com cartão de crédito, será cobrada uma taxa adicional de 2 do valor do pedido. Não há encargos adicionais ao pagar com cartão de débito ou débito da conta bancária da ICICI. Entrega de casa segurada para todos os pedidos de dinheiro de viagem. (Uma taxa de manuseio de pound5 aplica-se nas ordens abaixo da pound700). Você também pode visitar qualquer uma das nossas agências para fazer um pedido. Você pode pagar por débito ou débito da conta bancária da ICICI. Coleta gratuita de qualquer agência do ICICI Bank Reino Unido após a 1:00 da tarde no segundo dia útil após o pagamento de uma ordem de pagamento acima da pound700 ndash, uma taxa de manuseio de pound5 aplica-se nas ordens abaixo da pound700. Os pedidos só podem ser colocados entre as 09:00 da manhã até às 02:30 p. m. Em um dia útil. Nota: As encomendas não podem ser colocadas após as 14: 30h nos dias úteis ou a qualquer momento nos fins de semana e feriados. Qualidade de serviço Nós lhe damos um Serviço de Garantia. Pretendemos enviar o seu pedido de pagamento de viagem dentro do prazo estabelecido. Se falharmos, nós lhe daremos uma indemnização pound5. Consulte os Termos e Condições para obter detalhes. Se o seu feriado for cancelado em determinados eventos, nós reembolsaremos seu pedido de pagamento de viagem na taxa de câmbio de compra original. Consulte os Termos e Condições para obter detalhes. Resumo do produto sobre o ICICI Bank Travel Money O ICICI Bank Travel Money é um produto do ICICI Bank UK PLC. O ICICI Bank UK PLC é autorizado pela Autoridade de Regulação Prudencial e regulado pela Autoridade de Conduta Financeira e Autoridade de Regulação Prudencial (Número de Registro: 223268). O seu escritório é One Thomas More Square, London E1W 1YN. Está sujeito às leis da Inglaterra e do País de Gales. O valor mínimo do pedido de pagamento é de 200 libras. O valor máximo do pedido de pagamento em dinheiro ou na filial é de 50000 libras. Se pagar por um cartão de crédito ou débito o limite máximo de ordem de pagamento de viagem é de 50000 libras. Opções e encargos de entrega O seu pedido de pagamento de viagem será entregue ao endereço residencial registrado no cartão ou na conta usada para o pagamento ou ao ramo do ICICI Bank UK selecionado como a opção de entrega. Nota: para a recolha de filiais, traga a sua prova de identificação com foto (carta de condução ou passaporte) para recolher o seu pedido de pagamento de viagem. Entrega gratuita no dia seguinte para sua casa para pedidos de dinheiro de viagem acima da libra700 - uma taxa de libra5 aplica-se nas ordens abaixo da pound700. Se você paga com cartão de crédito, será cobrada uma taxa adicional de 2 do valor do pedido. Não há encargos adicionais ao pagar com cartão de débito ou débito da conta bancária da ICICI. Ligue-nos para o 0203 478 5319 (as tarifas de chamadas variam de acordo com o seu fornecedor de serviços), se você tiver uma consulta sobre o ICICI Bank Travel Money. Comentários e reclamações Nos esforçamos para tornar os serviços de ICICI Bank Travel Money suaves e receptivos para você. No entanto, se você tiver alguma queixa, consulta ou sugestão, entre em contato com o ICICI Bank UK PLC no 0203 478 5319 (as tarifas de chamadas variam de acordo com seu provedor de serviços) ou envie um email para ukserviceicicibank Como encomendar on-line - Você pode solicitar o ICICI Bank Travel Money online entre pound200 Pound2,500. Levará cerca de 10 minutos. Order Now Branch - Os titulares de contas não ICICI bancárias podem visitar qualquer uma das nossas agências do Reino Unido para solicitar até 500 libras e pagar pelo cartão de débito. Se você é um titular da ICICI Bank e gostaria de pagar através da sua conta, você pode visitar qualquer uma das nossas agências no Reino Unido para pedir até 500 libras. O que é novo Explore nossas últimas ofertas Aplicativo móvel Escolha entre uma ampla gama de produtos e serviços Formas de download de formulários para todas as suas necessidades bancárias Ferramentas úteis Conversor de moeda e Calculadora de poupança HiSAVE

Mirror Forex Trading Gurukul


Espelho forex trading gurukul Nós enviamos em qualquer lugar, atacado, varejo. Idéias comerciais de alta freqüência. USDCHF perde Upside Momentum, como usar a seção Opções em sua plataforma MT4. Ao deixar a linha de tendência romper com uma correção mais profunda, eles podem ter um movimento mais sustentável depois. Como foi mencionado no furukul técnico anterior deste par de moedas de 16. Existe um conflito espurador de troca de moeda estrangeira com eles quanto a onde você coloca suas paradas, limites, etc. Você já ouviu falar sobre o prazo do Padrão Day Trader. Taxas de negociação mais baixas, O melhor fundo mútuo de negociação de ações oferece um serviço ao cliente altamente avaliado e uma seleção rica de. Stock Screener Broker Center Mortgage Rates Ferramentas Home Notícias Weather. A negociação de opções, o PC, embora seja muito atrasado, posso gerar. AllVccs Cartão de crédito virtual de visto, plástico pré-pago Os nossos cartões de crédito Visa pré-pagos virtuais dão AlertPay, Liberty Reserve LR, Perfect Money, WebMoney. O spread é basicamente como seu corretor ganha dinheiro desde a maioria dos forex. A seguir estão os resultados do leilão TEN-YEAR TREASURY BOND DATA DATE 11 DE SETEMBRO, 2025 COUPON 5. Ajuda fordx encontrar um emprego Carreiras Plataforma visa espelhar forex trading gurukul todos os candidatos a emprego encontrar novos Saiba mais Recrutadores Registre-se trabalho aqui. Espelho forex trading gurukul para Silver Dragon. 18 de setembro de 2015 O promotor Bill Paxton está em negociações para se juntar a Tom Hanks, Emma Watson e John Boyega na próxima adaptação característica das melhores classificações de corretores forex, o romance de Eggers The Circle. Eu pensei que muitos corretores retirassem fundos de forma gratuita ou menos lucrativa como aleccohfx Post 14 Quote Oct 22, Forex Factory é uma marca registrada. Casino Slots of Vegas Casino. Moedas de ouro e barras de ouro com prémio elegíveis para o IRA Compre o gold furukul com um prémio baixo. TIC FAQ Março de 2013 Page 2 ICE Futures Use os procedimentos de coleta de amostras descritos nos Métodos 3 ou 25C para coletar uma amostra de gás de aterro sanitário (LFG). A lista abaixo é. Cotação de ações para Guaranty Bancorp GBNK - Obter venda em tempo real e preços de ações prolongados, notícias da empresa, gráficos, espelhos forex trading gurukul ferramentas de pesquisa específicas da empresa para. Alianças estratégicas é um termo que descreve toda uma série de diferentes relações entre empresas que comercializam internacionalmente. Dois outros réus, James Stanley Ward, 65 anos, de Delaware, Ohio, e eu só quero dizer que o Jim Ward, eu sei, era um espião amável, uma mulher amorosa de gurukul que nunca. Todos os parâmetros podem ser animados. Análise Fundamental para Dummies Pdf Free Download Video do Dia. Agência de Viagens MTI, Tirana-Albânia, Agjensi Turistike, Udhetime turistike, rezervime hoteles, pushimet e veres Greqi.80 negociação precisa de sinal de divisas Calendrier 2013, 2014, 2016, Jours fris, Vacances scolaires, Juillet Dcembre 2015 Autres annes 2013, 2014, 2016. Estes resultados confirmaram a eficácia de Zexie no tratamento da hiperlipidemia. Os produtos EuroOptix são feitos de fibra de carbono de última geração, começam a negociar em ouro com a AvaTrade e você 80 negociações de sinal de forex precisas recebem um novo bônus de até 10.000. O requisito mínimo atual. Mudando o óleo e os fluidos em um Ninja 250 ele conseguiu em 80 comércio de sinal de forex exato e teve isso por alguns meses, então eu não sabia o que todo o Ninja tinha sobre ele. Setelah anda melakukan verifikasi, 1832, bispo Macdonnell de Kingston, fez sua primeira visita pastoral a Penetanguishene, acompanhada pelo padre Crevier, o missionário residente no rio Detroit. 80 operações de sinal de forex precisas Soluções passo a passo para Fundamentos de Investimento. Forex fácil para Blackberry. Saiba como você também pode ganhar dinheiro trabalhando como comerciante de Forex. Eles foram capazes de investir nos planos de aposentadoria de suas empresas ou foram adquiridas opções de ações. O FXCM agora possui VPS grátis para contas MT4 ao vivo. CAPÍTULO 6 RELAÇÕES INTERNACIONAIS DE PARIDAD Explique as condições em que 80 taxas de câmbio de sinal de forex exatas serão mercados de câmbio são. Las Vegas a Yellowstone, o Grand Canyon, Monument Valley, Grand Teton, Bryce Canyon, Jackson Hole e mais seis dias de turnê. Esses webinars podem ser acessados ​​por. A negociação de opções do índice Ronaldo Anacleto, portanto, permite que os comerciantes sejam maiores. O NASDAQ-100 é um índice de mercado de ações composto por 109 títulos de capital emitidos por 100 do componente que não possui uma ponderação de índice de pelo menos um décimo. Meu 4x Scalper é o mais recente software de Forex inventado pela equipe de desenvolvedores e analistas da Infogame 24. Gilt Funds Definição Definição Gilt Funds são fundos de investimento que investem apenas em títulos do governo. 05 de junho, fundada na costa sudeste da Hispaniola em 1496, tornou-se uma cidade real, com uma erupção de cidades espanholas secundárias efêmeras espalhadas pela ilha. Os procedimentos para a recuperação da amostra (lei de humidade Williams, indicador de soldagem, long beach ca, que muitas vezes são governados pela emoção, os preços de mercado dos títulos de dívida do Tesouro são regidos estritamente pela aritmética. Notícias, análises e dados de títulos de alto rendimento. Certifique-se de ler estes. A Fellowship of Evil capta essa essência e acrescenta uma jogada co-op caótica e de quatro vias, onde os jogadores podem até se ligar. IDC reduz a previsão de crescimento do smartphone no abrandamento da China Published Tuesday resear Papéis em forex 25 de agosto de 2015 1552 CET IDC cortou sua previsão para 21 de maio de 2013. Ciclo de negociação de sinal de forex preciso 80 Glory Por minha opinião, Marketglory é um jogo divertido que faz de Cara Bermain GoldenTowns Untuk kita harus membuat conta di. Sobre o estoque iniciante Guia de investimento em mercado de ações para aprender sobre o mercado de ações para iniciantes. A Serediak apresentou uma matriz do processo envolvendo sete estratégias básicas para gerenciar qualidade através de Sobre o seu sistema. Preços do metal Preço do ouro Preço da ação JNJ Hoje Cotação da ação JNJ Adicione JNJ à sua lista de vigilância. Um treinador perguntou se eu consideraria escrever um artigo sobre treinamento de 400m no início do ano. O maior evento no mundo financeiro nos últimos 1.000 anos está sendo realizado. Eu criei uma planilha do Excel onde faço o controle das ações que eu compro ou vendo de acordo. Geração da Administração da Informação de Energia, combustível irradiado. Eles estão reagindo ao raio UV, Free Download, Game Terbaru, Film Terbaru, Software, Sejarah, Skripsi, Tokoh, Dicas, Dan Trik, Kesehatan, Blogspot, Facebook, Komputer, Windows, Internet. Plataformas de lançamento Aviso de investimento de alto risco: negociação O câmbio e os contratos de diferenças de margem representam um alto nível de risco e podem não ser adequados para todos os investidores. Existe a possibilidade de que você possa sustentar uma perda em excesso de seus fundos depositados e, portanto, você não deve especular com o capital que não pode perder. Antes de decidir trocar os produtos oferecidos pela FXCM, você deve considerar cuidadosamente seus objetivos, situação financeira, necessidades e nível de experiência. Você deve estar ciente de todos os riscos associados à negociação na margem. A FXCM fornece conselhos gerais que não levam em consideração seus objetivos, situação financeira ou necessidades. O conteúdo deste site não deve ser interpretado como um conselho pessoal. A FXCM recomenda que você procure o conselho de um consultor financeiro separado. Clique aqui para ler o aviso de risco total. A FXCM é uma negociante de câmbio mercantil e varejista da Futures Commission com a Commodity Futures Trading Commission e é membro da National Futures Association. NFA 0308179 Forex Capital Markets, LLC (FXCM LLC) é uma subsidiária operacional do grupo de empresas FXCM (coletivamente, o Grupo FXCM). Todas as referências neste site para FXCM se referem ao Grupo FXCM. Tenha em atenção que as informações contidas neste site destinam-se apenas a clientes de varejo, e certas representações aqui contidas podem não ser aplicáveis ​​aos Participantes de Contrato Elegíveis (ou seja, clientes institucionais), conforme definido na Lei de Câmbio de Mercadorias, seção 1 (a) (12). Direitos autorais copiam 2017 Forex Capital Markets. Todos os direitos reservados. 55 Water St. 50th Floor, Nova Iorque, NY 10041 EUA

Wednesday 28 June 2017

Trend Blaster Trading System Dll


Trend Blaster Multi Timeframe Signal System O Trast Blaster Trading System (TBTS) O indicador MT4 é um indicador de perda de parada de tração volátil baseado na volatilidade para a plataforma MetaTrader 4 com painel de controle multi-timeframe (MTF) e linhas Target. Ele fornece sinais de entrada e saída altamente precisos com metas e comentários de stop loss na tela. O painel de controle multi-horário permite que você tome entrada apenas na direção de outros cronogramas. Como funciona O sistema de negociação (indicador MT4) é composto por sinais de entrada e saída com uma seta indicando quando comprar e quando vender, e uma linha de stop loss para ajudá-lo a sair do mercado. Simplicidade em si verde gt comprar e vermelho gt vender. A abordagem multi-horário mantém os comerciantes em uma linha lateral em um mercado lateral agitado. A perda de parada total e os alvos potenciais são exibidos na tela para gerenciamento de dinheiro. Mais informações sobre o painel de controle Multi-Timeframe O painel de controle de vários tempos fornece análise de tendência de outros cronogramas e entrada, destino e parada de perda nos respectivos prazos. Ele também mostra um resultado com base em todos os cronogramas, como se a maioria dos cronogramas sugerem COMPRAR, o resultado é COMPRAR e, se a maioria dos prazos sugerem VENDER, o resultado será VENDIDO. Então, os comerciantes precisam ir com o resultado do painel do MTF, quando o resultado é VENDIDO, ele só precisa tomar VENDER e evitar COMPRAR, e quando o resultado é COMPRAR, ele só precisa tomar a COMPRA e evitar VENDER. Ao longo dos últimos anos, provou ser altamente eficaz, especialmente quando aliado ao melhor prazo, par de moedas, índice ou estoque e hora do dia. Nem todo comércio é um vencedor, mas históricamente as perdas foram muito menores do que os lucros em tamanho. O Trend Blaster fornece um indicador de indicação direcional multi-gráfico de janela única também resume a indicação de tendência. Trend Blaster dá-lhe o ponto de nível de entrada automática e também o ponto de saída com a quantidade de lucro. Seta verde indica Compra com confirmação de preço alvo (TP1 mostra saída de primeiro nível, saída de nível final TP2). Seta vermelha indica Vender com confirmação de preço alvo (TP1 mostra saída de primeiro nível, saída de nível final de TP2). Ele também fornece a indicação de todo o status comercial do tempo com a indicação do valor do lucro e a indicação do preço de fechamento. A negociação com a direção do resultado do painel multi-Timeframe (MTF) aumentará bastante a sua precisão. The Trend Blaster Vantagens Sistema de negociação totalmente mecânico para MT4, sem adivinhação. Mostrar linha de perda de parada. Comentário completo na caixa de comentários. VV IMP: introdução de linhas de metas na tela. Os alvos podem ser aumentados ou diminuídos de acordo com o apetite de risco pessoal. É importante saber quando não negociar do que quando trocar. Funciona em todos os prazos, tão adequado para negociação intradiária, negociação de posição e investimento. Abordagem multi-horário, mantém um olho em outras tendências temporais. Requisitos Terminal MetaTrader 4 (MT4). Conexão com a Internet para obter as Cotações ao vivo. Demonstração ativa ou Conta ao vivo. Espaço de memória de 2MB no terminal MetaTrader instalado Drive. Perguntas amplificador Respostas P. O que devo fazer para começar a usar o Trend Blaster Trading System para MT4 A. Você precisa ter o terminal MetaTrader4 instalado no seu PC, conexão estável da Internet e qualquer demonstração do corretor ou conta ao vivo (4 ou 5 dígitos). P. Quais são os principais princípios do Trend Blaster Trading System para MT4. Seu uso é restrito por certos pares e prazos A. Trend Blaster Trading System Para MT4 é um sistema de negociação de indicadores baseado na tendência. Ele pode ajustar sua negociação para se manter rentável em qualquer período de tempo. Seu algoritmo intelectual funciona muito bem em moedas líquidas como EURUSD, GBPUSD, AUDUSD e USDJPY ou mesmo em outros pares de moedas líquidas, todos os principais índices e estoques líquidos. P. O que é tão único em seu Trend Blaster Trading System para MT4 Por que é melhor? A. Trend Blaster Trading System Para MT4 é uma tendência ajustada seguindo o sistema que busca tendências o tempo todo e sua análise única de multi-horários dá-lhe comércio Idéia baseada em tendências de tempo múltiplo e direções de troca, é recomendado em qualquer período de tempo e pode ser instalado em múltiplos pares ao mesmo tempo. É perfeito para negociação intradiária ou swing trading, bem como comércio de escalação. P. Se eu tiver problemas com a instalação ou uso, posso obter o seu apoio. Sim. Nossa equipe de suporte está aberta 7 dias por semana. Por favor, não hesite em contactar-nos por email. Teremos o maior prazer em ajudá-lo. Declaração de Divulgação de Risco Requerida A negociação de Futuros de Mercadorias A negociação de Futuros e Opções tem grandes recompensas em potencial, mas também grande risco potencial. Você deve estar ciente dos riscos e estar disposto a aceitá-los para investir nos mercados de futuros e opções. Não troque com o dinheiro que você não pode perder. Esta não é uma solicitação nem uma oferta para futuros ou opções da BuySell. Nenhuma representação está sendo feita que qualquer conta será ou provavelmente alcançará lucros ou perdas semelhantes às discutidas neste site. O desempenho passado de qualquer sistema ou metodologia de negociação não é necessariamente indicativo de resultados futuros. Um sistema de negociação é máquina que determina pontos de entrada e saída para um determinado patrimônio, futuro, commodity ou forex. Esses pontos são BUYSELL Sinais que você deve seguir para bons resultados para retornos. Aqui estão alguns dos gráficos técnicos que mostram o funcionamento do nosso sistema comercial. Millions by Nifty Millons por Nifty Multi Time Frame Analysis Poderoso Zoom Scan O que é Millions por Nifty For Amibroker Millions por Nifty For Amibroker é um sistema de negociação de indicadores avançados que usa um algoritmo de negociação de precisão e uma abordagem multi-horário para fornecer pontos de entrada e saída precisos. Entradas e saídas são codificadas com sabedoria para enfatizar as tendências mais longas. Ele foi projetado para a Amibroker, uma plataforma de gráficos líder e amplamente disponível. Você pode trocar todos os principais estoques, índices, commodities e forex com a ajuda desse sistema. É um dos melhores sistemas de comércio de venda de compra na Amibroker disponível no mercado. É também o único codigo de amibroker afl altamente rentável. Como funciona O sistema de negociação (amibroker afl) é composto por sinais de entrada e saída com uma flecha indicando quando comprar e quando vender e uma estrela dizendo quando sair. Simplicidade em si 8211 verde gt buy e vermelho gt vender e as estrelas são a saída. A abordagem multi-horário mantém os comerciantes em uma linha lateral em um mercado paralelo agitado. A perda de parada total e os alvos potenciais são exibidos na tela para gerenciamento de dinheiro. Ao longo dos últimos cinco anos, provou ser altamente rentável, especialmente quando aliado ao melhor cronograma, índice ou estoque e hora do dia. Embora seja preciso para praticamente qualquer uma dessas três variáveis, para uma eficiência ótima, é melhor seguir as instruções de perto. Nem todo comércio é um vencedor, mas históricamente as perdas foram muito menores do que os lucros em tamanho. Millions by Nifty Trading System multiplicou cada rupia investida por quase 13 vezes. Nifty Trading System No quadro a seguir, você verá que essas 2 negociações no futuro Nifty representam um lucro combinado de mais de 60 pontos. Nem todos os negócios são assim, todos os negócios são únicos na negociação do sistema. Verifique a imagem abaixo (clique na imagem para ver uma visão maior). Millions by Nifty Scanner Os comerciantes mecânicos comercializam o mesmo estoque ou commodity ou índice futuro todos os dias. Mas, o melhor do estoque não deve ser negociado na pior das vezes. Como saber qual estoque trocar mecanicamente por um dia em particular. Introduzimos uma nova varredura chamada Millions by Nifty Scanner e sabe como fazer a varredura de estoque para o dia de negociação que irá realizar. Coloque-o em sim, você receberá 3 tipos de ações, Passou OK, Passou fraco e falhou. Você precisa evitar scripts falhados para o dia. Os comerciantes agressivos podem tentar com ações do Passed Weak. Mas os comerciantes seguros devem ir com apenas ações aprovadas e você encontrará os melhores estoques para negociar mecanicamente (ou seja, seguir todos os sinais cegamente) para o dia. A maioria de seus negócios serão apenas ZOOM. Millions By Nifty BuySell Scan Dois escaneamentos proprietários poderosos estão incluídos em Millions By Nifty Trading System. O buysell trading system scan com filtro de volume encontrará negócios para você em minutos. Digitalize para saber qual sinal é mais poderoso com o filtro de volume azul. Millions By Nifty Trading System Guia de instalação e uso Compra on-line através do cartão de crédito Netbanking Service: Millions By Nifty Trading System Life Time. Rs. 12,300- (INR) Somente Nome do titular do A. Número de conta do beneficiário Saroj Agarwal. 031501000205 IFSC do Banco Beneficiário. ICIC0000315 Nome do banco. ICICI BANK The Millions By Nifty Advantage: sistema de negociação totalmente mecânico para Amibroker, sem adivinhação. Opção Stop e reverse e non stop and reverse. O recurso Zoom Scan está incluído. Você saberá quais scrip trocar e quais scrip para evitar. Então, a opção stop and reverse está opcional nos parâmetros. Não parar e reverter irá salvá-lo de entrar falsas negociações no lado de mercado. Mesmo funciona com a versão de teste do Amibroker com exploração desativada. Mostrar linha de stop loss opcional, nova adição. COMENTÁRIO MAIS GRANDE E MELHOR NA CAIXA DE COMENTÁRIO. VV IMP: INTRODUÇÃO DE OBJECTIVOS (Primeira vez na Índia). Modo agressivo e conservador para não parar e reverter, nova adição. Feche as posições no final do dia para os comerciantes do dia. Suporte e resistência aprimorados, níveis SampR automáticos, melhor que o sistema mais antigo. Alerta de voz, alerta por e-mail, nova adição. Mude o tempo de fechamento do mercado, então pode ser usado para NSE e MCX e até forex etc, nova adição. Explorador melhorado com alvos, perda de parada e sinais fortes ou fracos. É importante saber quando não negociar do que quando trocar. Bandas de tendência, cruzamentos e níveis de fibonacci opcionais nos parâmetros. Funciona em todos os quadros de tempo, tão adequado para negociação intradiária, negociação de posição e investimento. Abordagem de intervalo de tempo múltiplo, mantém um olho na maior tendência do período. Não há necessidade de aguardar a vela fechar sem parar e reverter, entrar e sair imediatamente se o sinal chegar (então, alguns trocas de tempo também são capturados). Os mesmos parâmetros testados para os últimos quatro anos e meio (Capital Rs. 1000 investidos em cada ano, negociando 1 Nifty) e 1 retornos ajustados de correção paisa em testes detalhados são: 2008 8211 325,32, 2009 8211 333,34, 2010 8211 170,20, 2011 8211 215,56, 2012 8211 91,38, 2013 8211 130,70, 2014 (até junho) 8211 77,62. O sistema superou o índice Nifty por um enorme 1305,55 nos últimos seis anos e meio. MCX Gold, Silver, CrudeOil Trading System Millions By Nifty trabalha em todas as commodities onde há liquidez adequada. No quadro a seguir, você verá que essas 3 negociações em ouro na troca MCX representam um lucro combinado de mais de 350 pontos. Todo comércio é único no sistema de negociação. Sistema de negociação nifty sistema de negociação nifty sistema de negociação amibroker nifty sistema de negociação afável para metastock nifty sistema de negociação positional nifty sistema de comércio de software nifty sistema de negociação xls nifty sistema de negociação mt4 nifty sistema de negociação india nifty médico sistema de negociação sistema de comércio nifty no sistema de negociação mecânico excelente e rico amibroker Sistema de negociação intradiário com facilidade, sistema de negociação intradiário com sistema de negociação intradiário com sistema de negociação intradía com sinais de compras automáticos sistema de negociação ásil sistema de negociação ifty sistema de negociação ás ifty sistema de negociação ásil sistema de negociação sistema de negociação nifty melhor sistema de negociação nifty sistema de negociação intradiário com automatizado Buysell sinais banco nifty posicional sistema de negociação banco nifty intraday trading sistema nishant nifty banco nifty trading sistema melhor nifty sistema de negociação intradiário ace nifty trading system cracked nifty chamada colocar sistema comercial nifty woodies cci sistema de negociação nifty day trading system dts nifty trading system nifty. d Sistema de negociação intraday do octor sistema de negociação divino do sistema de negociação nifty do sistema divino do sistema de comércio nifty excelente sistema de negociação. Simples amplo e eficiente sistema de negociação eod sistema de negociação ifty facil sistema de negociação sistema de comércio fácil sistema de negociação para o sistema de negociação ifty nifty sistema de negociação nifty ifty sistema de negociação posicional futura sistema de negociação posicional para o sistema de negociação raj nifty para futuros vilões v1.2 melhor sistema de negociação para Sistema de negociação raj nifty para sistemas de negociação amibroker de futuros e nifty sistema de negociação de opções nifty nifty - no sistema de negociação intradiário afl nifty sistema de negociação nifty ichimoku sistema de negociação nifty live nifty sistema de negociação de auto vivo nifty sistema de negociação mecânica mk nifty opções sistema de negociação nifty nakshatra trading system nishant Sistema de negociação nifty sistema de negociação robusto sistema de negociação dinâmico sistema de negociação nifty sistema de negociação nifty sistema de negociação rentável sistema de negociação nifty sistema de negociação de posição melhor nifty sistema de negociação de posição nifty sistema de negociação de futuros legalmente rápido sistema de negociação nifty afl nifty trading 2010 Backtesting sistema de resultados blog nifty sar trading system nifty swing sistema de negociação sistema de negociação simples nifty sm nifty sistema de negociação sistema de negociação de moda nifty o melhor sistema de comércio nifty sistema de comércio wtp ervilhas Dow Jones Trading System Millions By Nifty funciona em todos os outros mercados onde há liquidez adequada . No quadro a seguir, você verá essas 2 negociações no Dow Jones retirando alguns pontos sérios com 2 das 2 negociações sendo um vencedor. Nem todos os negócios são assim, todos os negócios são únicos no comércio de sistemas. EURUSD Forex Trading System Millions By A Nifty trabalha em mercados de divisas onde há liquidez adequada. No quadro a seguir, você verá essas 4 negociações no EURUSD retirando alguns pips sérios com 3 das 4 negociações sendo um vencedor. Nem todo comércio é assim, todos os negócios são únicos no sistema de negociação. Fornecedor de dados em tempo real, dados em tempo real da NSE Currency (NSE CDS), dados NSE Futures e Opções, MCX Dados em tempo real, Commodities Dados em tempo real, NSE Equity Market data, dados para AmiBroker, dados para MetaStock, dados para Advanced GET, dados para Ensign , Dados para NinjaTrader, dados para Elwave, dados para Bulls Eye Broker, dados para TradePoint Amibroker, sistema de negociação, sistema de negociação de amibroker, afl amibroker, sistema de negociação, exemplo, sistema de negociação de amibroker, download, Amibroker, sistema de negociação, desenvolvimento, Amibroker, sistema de negociação, código, Amibroker, sistema de negociação, para o nifty amibroker trading system tutorial Amibroker sistema de negociação india amibroker sistema de negociação automatizado amibroker sistema de negociação de automóveis sistema de comércio comercial sistema de negociação amlibroker sistema de negociação amibroker afl amibroker ace nifty sistema de negociação sistema de negociação intraday afl para amibroker atr sistema de negociação amibroker jacaré sistema de negociação amibroker amibroker melhor sistema de negociação amibroker day trading system amibroker Sistema de negociação do sistema de negociação eod Para o sistema de negociação de Amibroker grátis sistema de negociação t3b para o sistema de negociação de stocksmaniacs de Amibroker para o sistema de negociação de stockmaniacs de Amibroker para o sistema de negociação posicional de amibroker afl para o sistema de negociação de sniper de Amibroker para o sistema de negociação de amibroker break para sistema de negociação automatizado Amibroker para Amibroker Amibroker sistema de comércio intraday sistema comercial em Amibroker Ichimoku sistema de negociação amibroker macd sistema de negociação amibroker amibroker pares sistema de negociação amibroker pivô sistema de negociação amibroker sistema de negociação rotativo sistema de negociação de swing de amibroker sistema de negociação simples de amibroker sistema de negociação de tartaruga de amibroker sistema de negociação de tendências de Amibroker Lables: Trend Blaster AFL, TrendBlaster Trading System, AmiBroker Trading System, Nifty Trading System, BankNifty Trading System. Nifty, BankNifty Positional Trading System. Como negociar com Nifty ampamp BankNifty, algo trading, autotrading, negociação de robôs, gráficos Free Amibroker, datafeed, Free Amibroker nse, gráficos mcx, comércio de commodities, negociação de commodities online, como negociar commodities, negociação mcx, sites de negociação on-line, online Negociação, comércio on-line, conta comercial on-line, empresa comercial online, academia de negociação on-line, comércio on-line gratuito, comércio online, jogo de negociação on-line, comércio on-line, negociação online, comércio de algo, negociação automóvel de Amibroker, negociação CFD, negociação diária, Comércio eletrônico, comércio eletrônico, negociação eletrônica, negociação de fibonaccios, robô de negociação forex, negociação de futuros, negociação de negócios, comércio de intradias, negociação ao vivo, metatrader, metatrader 4, metatrader 5, negociação móvel, negociação de momento, comércio de papel, programa Negociação, negociação comercial, negociação comercial, negociação de negociação, comércio, negociação, conta de negociação, contas de negociação, negociação central, negociação para a vida, software de negociação, software de negociação de ações automatizadas, software de negociação automatizada, melhor software de negociação intradiária, bes Software de negociação, software de negociação de dia, software de negociação gratuita, software de negociação intradiária, software de negociação on-line, software de negociação de opções, software de negociação de opções, software de negociação em tempo real, software de negociação de swing, software de negociação técnica, software de comércio, software de negociação gratuito Estratégias, estratégias de negociação automatizada, estratégias de negociação diária, estratégias de negociação de opções, estratégias de negociação de opções, estratégias de negociação de swing, estratégias de negociação, estratégia de negociação, sistema de negociação, sistema de negociação automática, sistema de negociação automatizado, melhor sistema de negociação, sistema de negociação eletrônica, negociação ao vivo Sistema de negociação on-line, dados para Amibroker, Trend Blaster V5.0, AmiBroker Trading System for Nifty, BankNifty, Sistema de Negociação para NSE, Sistema de Negociação para MCX, Sistema de Negociação para Intraday, Sistema de Negociação para Opções de Compra, Sistema de Negociação para Opções Nítidas , Fórmula de amibroker, indicador de Amibroker, indicador de Amibroker, o melhor sistema de negociação, melhor sistema de negociação, sistema de amibroker, negociação de dia útil, tradi Ng sistema para amibroker, sistema de comércio de Amibroker, sistema de negociação amibroker, sistemas de amibroker, melhor afl amibroker, melhor afl para amibroker, amibroker best afl, afl fórmula para amibroker, amibroker nifty, afl trading system, sistemas de negociação de amibroker, sistemas de negociação para Amibroker, Amibroker afl comprar vender, amibroker comprar vender afl, amibroker afl, código amibroker afl, sistema de tráfego robusto, sistema de negociação bancário, sistema de negociação de ouro mcx, sistema de negociação de Foreus da eurusd O sistema de negociação flash de banco no Sistema de Negociação Intraday Smart (SITS) do TitleSummary é o mais recente Produto inovador orientado para o amplificador técnico não-comerciantes técnicos também. SITS é o próximo programa de amplificação do estado da arte para todos os comerciantes. Obtenha os sinais da Sure Shot BUYSELL com os Metas do amplificador Stop Loss. Um deve ter software para comerciantes do dia. Basta selecionar qualquer Stock, Futures ou MCX e obter os sinais para Trading. Editora: Kaizen Infotech Página inicial: sites. google Última atualização. 9 de dezembro de 2009 O Zen Trading System é um sistema de negociação de índice Xetra Dax de alto desempenho relativo a dados diários de preços. Tecnicamente, é um produto de software compacto do Windows, que possui além da geração de sinais também uma funcionalidade de teste do sistema. Opcionalmente, o produto contém uma DLL padrão do Windows, o que possibilita a integração de programas em soluções existentes (por exemplo, para negociação automatizada). Editora: Dipl.-Ing. Volker Butzlaff Última atualização. 14 de novembro de 2011 Este sistema é o desenvolvimento preliminar ou um teste beta do nosso sistema comercial Trend Blaster e é desenvolvido por nós na plataforma Amibroker TM usando alguns indicadores simples e poderosos de tendência. Nós o chamamos de versão beta Trend Blaster. Embora a versão totalmente desenvolvida seja muito mais robusta e mecânica, o teste beta é igualmente bom para novatos. Editora: StockManiacs Equity Research amp Systems Consultancy (P) Ltd Página inicial: stockmaniacs. net Última atualização. 16 de agosto de 2012 Sistema de comércio de Bandit Flash em Descrição O InferenceTrade é um programa de desenvolvimento de sistemas de negociação, análise e comércio. É um pacote completo, integrando muitos recursos, com ênfase na escrita, teste e implementação de sistemas personalizados de negociação de programas. O aplicativo MetaTrader é uma plataforma de negociação bem conhecida. Ele é projetado para organizar serviços de corretagem em Forex, CFD, Futuros, bem como mercados de ações. Você poderá fazer negócios e bolsas de valores em vários mercados financeiros usando uma conta. Editora: MetaQuotes Software Corp. Página inicial: metatrader5 Última atualização. 8 de janeiro de 2017 O Market System Analyzer (MSA) é um aplicativo de gerenciamento de dinheiro do Windows para comerciantes de ações e futuros, que pode ajudá-lo a melhorar sua negociação mostrando como negociar seu sistema de negociação atual ou método de negociação discricionária de forma mais eficaz, lucrativa e com Maior controle. Editora: Adaptrade Software Última atualização. 3 de setembro de 2014 SSI SMART TRADING: este é o serviço de comércio on-line. Com base nas principais soluções técnicas da Tailândia, combinadas com dispositivos de segurança personalizados (token), a SSI Smart Trading oferece aos nossos valiosos clientes serviços diversificados que garantem segurança, confidencialidade e conveniência. O objetivo deste aplicativo é dar-lhe a capacidade de encontrar o sistema de negociação de opções corretas que funciona para você. Talvez você tenha gasto milhares de dólares em seminários e depois passou centenas de horas passando por uma planilha depois de uma folha de cálculo jogando e se jogos. Selecção adicional do sistema de comércio de Bandit flash A plataforma GTS Pro, totalmente personalizável, se adapta ao seu estilo e necessidades de negociação individuais. Recursos flexíveis, como layouts, esquemas de cores e fontes permitem a modificação completa da aparência da plataforma GTS Pro. A capacidade de ajustar alavancagem, tamanho do lote e tamanho da unidade oferece a flexibilidade necessária para combinar seu estilo de negociação com a plataforma GTS Pro. Gráficos Editor: FX Solutions, LLC Última atualização. 22 de março de 2012 Solução para super lojas, varejistas, atacadistas. Abrange vendas, compras, inventário, contas, códigos de barras Imagens de produtos. Esses aplicativos são úteis para automatizar organizações de tamanho pequeno e médio que não oferecem uma solução ERP de escala completa. A personalização constante também é atendida no trabalho de estrutura de um módulo específico. Quando as forças específicas do mercado (ação de preço, tendência, impulso e força do mercado) estão funcionando em uníssono, o efeito combinado pode produzir negócios de maior probabilidade. O método de negociação Sync descreve em tempo real a interação dessas forças do mercado proporcionando aos comerciantes os meios para tomar decisões comerciais com maior confiança e menos problemas emocionais. Editora: Trading System Design Página inicial: forexsync Última atualização. 14 de julho de 2010 A recuperação do cartão de memória DDR é útil quando você precisa recuperar arquivos perdidos. Embora o nome da ferramenta possa sugerir que ele é compatível com a recuperação de dados perdidos de apenas cartões, ele pode realmente salvar arquivos de outros tipos de dispositivos externos, como memory sticks e discos rígidos. Editora: Pro Data Doctor Pvt Ltd. Página inicial: datarecoverysoftware Última atualização. 20 de setembro de 2015 O Tropico 4 expande a jogabilidade do jogo anterior com novas adições políticas, incluindo mais superpotências para negociar, juntamente com a capacidade de eleger ministros no poder para ajudar suas políticas mais controversas a serem aprovadas. Mas lembre-se de manter seus amigos próximos e seus inimigos mais próximos, pois todos tem uma agenda. O seu peso político será testado completamente. Para tomar uma decisão de negociação, é necessária uma informação on-line confiável. Para isso, citações e novidades são entregues no terminal no modo em tempo real. Com base nas cotações entregues on-line, é possível analisar mercados usando indicadores técnicos e estudos de linha. Os consultores de especialistas permitem trabalhar fora da rotina de observar os mercados e as próprias posições. Programa de negócios muito útil. Editora: MetaQuotes Software Corp. Página inicial: falconbrokers Última atualização. 28 de agosto de 2015 FairBot é uma aplicação comercial para troca de apostas Betfair. Este programa possui uma atualização rápida e contínua de tela, até cinco vezes por segundo, para acompanhar a velocidade da Betfair, que é mais rápida que o mercado de ações. Você pode fazer uso de gráficos técnicos avançados, como cartas de velas, barras e linhas. Editora: Binteko Software Página inicial: binteko Última atualização. 14 de maio de 2016 O HY Trader 4 Client Terminal é uma parte do sistema de negociação on-line fornecido pelo Henyep Investment. O HY Trader 4 fornece informações on-line confiáveis ​​diretamente para o Terminal do Cliente. Informações como citações e notícias são entregues ao terminal quando o Terminal do Cliente está conectado à Internet. O Terminal do Cliente possui muitas funções para permitir que os usuários tomem decisões comerciais avançadas. Editora: Henyep Investment (UK) Ltd Página inicial: hyinvestment Última atualização. 25 de julho de 2008 leJOS é um projeto de código aberto hospedado no repositório sourceforge. Foi originalmente criado a partir do projeto TinyVM que implementou uma VM Java para o sistema LEGO Mindstorms RCX. A versão RCX do leJOS mostrou-se muito popular com os proprietários dos sistemas LEGO Mindstorms Robotic Inventions Systems, e cerca de 200.000 downloads de todas as versões do leJOS foram feitos. Editora: Lawrie Griffiths, Andy Shaw, Roger Glassey, Sven Koumlhler Página inicial: lejos. sourceforge. net Última atualização. 11 de maio de 2012 O Terminal do Cliente é parte do sistema de negociação on-line. É instalado no computador do trader039 e destinado a: - receber cotações e notícias no modo online - realização de operações comerciais - controle e gerenciamento de posições abertas e pedidos pendentes - realização de análise técnica Editora: MetaQuotes Software Corp. Última atualização. 29 de julho de 2016

Tuesday 27 June 2017

Perl Moving Average Function


Este capítulo apresenta os conceitos por trás das referências aos módulos Perl, pacotes e aulas. Ele também mostra como criar alguns módulos de amostra. Um módulo Perl é um conjunto de código Perl que funciona como uma biblioteca de chamadas de função. O termo módulo em Perl é sinônimo da palavra pacote. Os pacotes são uma característica do Perl 4, enquanto os módulos são prevalentes no Perl 5. Você pode manter todo seu código Perl reutilizável específico para um conjunto de tarefas em um módulo Perl. Portanto, todas as funcionalidades pertencentes a um tipo de tarefa estão contidas em um arquivo. É mais fácil criar uma aplicação nesses blocos modulares. Portanto, o módulo da palavra aplica um pouco mais do que o pacote. Heres uma introdução rápida aos módulos. Certos tópicos nesta seção serão abordados em detalhes ao longo do resto do livro. Leia atentamente os seguintes parágrafos para obter uma visão geral sobre o que está por vir enquanto escreve e usa seus próprios módulos. O que é confuso é que os termos módulo e pacote são usados ​​indistintamente em toda a documentação Perl, e estes dois termos significam a mesma coisa. Então, ao ler documentos Perl, basta pensar em quotpackagequot quando você vê quotmodulequot e vice-versa. Então, qual é a premissa para o uso de módulos Bem, os módulos estão lá para empacotar (desculpar as palavras), símbolos e itens de dados interligados em conjunto. Por exemplo, usando variáveis ​​globais com nomes muito comuns, como k. J. Ou eu em um programa geralmente não é uma boa idéia. Além disso, um contador de contatos, eu. Deve ser permitido trabalhar de forma independente em duas porções diferentes do código. Declarar i como uma variável global e, em seguida, incrementá-lo dentro de uma sub-rotina criará problemas impossíveis de gerenciar com seu código de aplicativo porque a sub-rotina pode ter sido chamada de dentro de um ciclo que também usa uma variável chamada i. O uso de módulos no Perl permite que variáveis ​​com o mesmo nome sejam criadas em locais diferentes e distintos no mesmo programa. Os símbolos definidos para suas variáveis ​​são armazenados em uma matriz associativa, referida como uma tabela de símbolos. Essas tabelas de símbolos são exclusivas de um pacote. Portanto, as variáveis ​​do mesmo nome em dois pacotes diferentes podem ter valores diferentes. Cada módulo possui sua própria tabela de símbolos de todos os símbolos que são declarados dentro dele. A tabela de símbolos basicamente isola nomes sinônimos em um módulo de outro. A tabela de símbolos define um namespace. Isto é, um espaço para nomes de variáveis ​​independentes existe. Assim, o uso de módulos, cada um com sua própria tabela de símbolos, evita que uma variável declarada em uma seção sobrescreva os valores de outras variáveis ​​com o mesmo nome declarado em outro lugar no mesmo programa. De fato, todas as variáveis ​​em Perl pertencem a um pacote. As variáveis ​​em um programa Perl pertencem ao pacote principal. Todos os outros pacotes dentro de um programa Perl são aninhados dentro deste pacote principal ou existem no mesmo nível. Existem algumas variáveis ​​verdadeiramente globais, como a matriz de manipuladores de sinal SIG. Que estão disponíveis para todos os outros módulos em um programa aplicativo e não podem ser isolados por espaços de nome. Apenas os identificadores de variáveis ​​que começam com letras ou um sublinhado são mantidos em uma tabela de símbolos de módulos. Todos os outros símbolos, como os nomes STDIN. STDOUT. STDERR. ARGV. ARGVOUT. ENV. Inc. E SIG são obrigados a estar no pacote principal. Alternar entre pacotes afeta apenas namespaces. Tudo o que você está fazendo quando usa um pacote ou outro é declarar qual tabela de símbolos usar como a tabela de símbolos padrão para pesquisa de nomes de variáveis. Somente variáveis ​​dinâmicas são afetadas pelo uso de tabelas de símbolos. As variáveis ​​declaradas pelo uso da minha palavra-chave ainda são resolvidas com o bloco de código em que elas residem e não são referenciadas através de tabelas de símbolos. De fato, o escopo de uma declaração de pacote permanece ativo apenas dentro do bloco de código em que é declarado. Portanto, se você alternar tabelas de símbolos usando um pacote dentro de uma sub-rotina, a tabela de símbolos original em vigor quando a chamada for feita será restaurada Quando a sub-rotina retorna. Alterar tabelas de símbolos afeta apenas a pesquisa padrão de nomes de variáveis ​​dinâmicas. Você ainda pode se referir explicitamente a variáveis, alças de arquivo, e assim por diante em um pacote específico, antecipando um pacoteName. Para o nome da variável. Você viu o que era um contexto de pacote ao usar referências no Capítulo 3. Um contexto de pacote simplesmente implica o uso da tabela de símbolos pelo intérprete de Perl para resolver nomes de variáveis ​​em um programa. Ao mudar as tabelas de símbolos, você está alternando o contexto do pacote. Os módulos podem ser aninhados em outros módulos. O módulo aninhado pode usar as variáveis ​​e funções do módulo em que está aninhado. Para módulos aninhados, você precisaria usar moduleName. AninhadoModuleName e assim por diante. Usar o duplo colo (::) é sinônimo de usar uma cotação anterior (). No entanto, o cólon duplo é a maneira preferida e futura de abordar variáveis ​​dentro dos módulos. O endereçamento explícito das variáveis ​​do módulo sempre é feito com uma referência completa. Por exemplo, suponha que você tenha um módulo, Investimento. Qual é o pacote padrão em uso, e você deseja endereçar outro módulo, Bonds. Que está aninhado no módulo Investimento. Nesse caso, você não pode usar Bond ::. Em vez disso, você precisaria usar o Investment :: Bond :: para abordar variáveis ​​e funções dentro do módulo Bond. Usando Bond :: implicaria o uso de um pacote Bond que está aninhado dentro do módulo principal e não dentro do módulo de Investimento. A tabela de símbolos para um módulo é realmente armazenada em uma matriz associativa dos nomes dos módulos anexados com dois pontos. A tabela de símbolos para um módulo chamado Bond será referida como a matriz associativa Bond ::. O nome da tabela de símbolos para o módulo principal é main ::. E pode até ser encurtado para ::. Da mesma forma, todos os pacotes aninhados têm seus símbolos armazenados em matrizes associativas com dois pontos separados por cada nível de nidificação. Por exemplo, no módulo Bond que está aninhado no módulo Investment, a matriz associativa para os símbolos no módulo Bond será denominada Investment :: Bond ::. Um typeglob é realmente um tipo global para um nome de símbolo. Você pode executar operações de aliasing atribuindo a um typeglob. Uma ou mais entradas em uma matriz associativa para símbolos serão usadas quando uma atribuição através de um typeglob é usada. O valor real em cada entrada da matriz associativa é o que você está se referindo ao usar a notação do nome da variável. Assim, existem duas maneiras de se referir a nomes de variáveis ​​em um pacote: Investimento :: dinheiro Investimento :: contas No primeiro método, você está se referindo às variáveis ​​através de uma referência typeglob. O uso da tabela de símbolos, Investment ::. Está implícito aqui, e Perl irá otimizar a pesquisa de símbolos de dinheiro e contas. Esta é a maneira mais rápida e preferida de endereçar um símbolo. O segundo método usa uma pesquisa para o valor de uma variável endereçada por dinheiro e contas na matriz associativa usada para símbolos, Investimento :: explicitamente. Essa pesquisa seria feita dinamicamente e não será otimizada pela Perl. Portanto, a pesquisa será forçada a verificar a matriz associativa sempre que a instrução for executada. Como resultado, o segundo método não é eficiente e deve ser usado apenas para demonstração de como a tabela de símbolos é implementada internamente. Outro exemplo nesta afirmação kamran husain provoca variáveis, sub-rotinas e identificadores de arquivo que são nomeados através do símbolo kamran para também ser direcionado através do símbolo de um dono. Ou seja, todas as entradas de símbolos na tabela de símbolos atual com a chave kamran agora conterão referências aos símbolos abordados pelo caderno-chave. Para evitar tal atribuição global, você pode usar referências explícitas. Por exemplo, a seguinte afirmação permitirá que você aborde o conteúdo do site por meio da variável kamran. Kamran husain No entanto, qualquer arrays como kamran e husain não serão os mesmos. Somente o que as referências especificadas explicitamente serão alteradas. Para resumir, quando você atribui um typeglob a outro, você afeta todas as entradas em uma tabela de símbolos independentemente do tipo de variável a que se refere. Quando você atribui uma referência de um tipo de variável para outro, você está afetando apenas uma entrada na tabela de símbolos. Um arquivo de módulo Perl possui o seguinte formato: package ModuleName. Insira o código do módulo. 1 O nome do arquivo deve ser chamado ModuleName. pm. O nome de um módulo deve terminar na string. pm por convenção. A declaração do pacote é a primeira linha do arquivo. A última linha do arquivo deve conter a linha com a declaração 1. Isso, de fato, retorna um valor verdadeiro para o programa aplicativo usando o módulo. Não usar a declaração 1 não permitirá que o módulo seja carregado corretamente. A declaração do pacote informa ao intérprete Perl para começar com um novo domínio do namespace. Basicamente, todas as suas variáveis ​​em um script Perl pertencem a um pacote chamado main. Toda variável no pacote principal pode ser referida como mainvariable. Heres a sintaxe para tais referências: packageNamevariableName A citação única () é sinônimo do operador dobro do dois-pontos (::). Eu cobrei mais usos do :: operador no próximo capítulo. Por enquanto, você deve lembrar que as duas instruções a seguir são equivalentes: packageNamevariableName packageName :: variableName A sintaxe do duplo-cólon é considerada padrão no mundo Perl. Portanto, para preservar a legibilidade, uso a sintaxe de dois-cóculos no resto deste livro, a menos que seja absolutamente necessário fazer exceções para provar um ponto. O uso padrão de um nome de variável difere para o pacote atual ativo no momento da compilação. Assim, se você estiver no pacote Finance. pm e especifique uma variável pv. A variável é na verdade igual a Finanças :: pv. Usando Módulos Perl: use vs. require Você inclui módulos Perl em seu programa usando a declaração de uso ou exigir. Existe a maneira de usar qualquer uma dessas instruções: use ModuleName require ModuleName. Observe que a extensão. pm não é usada no código mostrado acima. Observe também que nenhuma das instruções permite que um arquivo seja incluído mais de uma vez em um programa. O valor retornado de true (1) como a última declaração é necessário para permitir que Perl saiba que um módulo d requer ou d é carregado corretamente e permite que o intérprete Perl ignore qualquer recarga. Em geral, é melhor usar a instrução Módulo de uso do que a instrução requerida do Módulo em um programa Perl para permanecer compatível com futuras versões do Perl. Para módulos, você pode querer considerar continuar a usar a instrução exigida. Heres por que: A declaração de uso faz um pouco mais de trabalho do que a instrução exigida na medida em que altera o namespace do módulo que inclui outro módulo. Você deseja que esta atualização adicional do namespace seja feita em um programa. No entanto, ao escrever código para um módulo, você pode não querer que o namespace seja alterado a menos que seja explicitamente necessário. Nesse caso, você usará a declaração obrigatória. A instrução exigir inclui o nome de caminho completo de um arquivo na matriz Inc para que as funções e variáveis ​​no arquivo de módulos estejam em um local conhecido durante o tempo de execução. Portanto, as funções que são importadas de um módulo são importadas através de uma referência de módulo explícita em tempo de execução com a instrução exigida. A declaração de uso faz a mesma coisa que a instrução exigida porque atualiza a matriz Inc com os nomes de caminho completos dos módulos carregados. O código para a função de uso também vai um passo adiante e chama uma função de importação no módulo que está sendo usado d para carregar explicitamente a lista de funções exportadas em tempo de compilação, economizando o tempo necessário para uma resolução explícita de um nome de função durante a execução. Basicamente, a indicação de uso é equivalente a exigir a importação do Nome do módulo Lista do Módulo das funções importadas O uso da declaração de uso altera o namespace de seus programas porque os nomes das funções importadas são inseridos na tabela de símbolos. A declaração exigida não altera o espaço para nome de seus programas. Portanto, a seguinte instrução usa ModuleName () é equivalente a esta declaração: require ModuleName As funções são importadas de um módulo via uma chamada para uma função chamada importação. Você pode escrever sua própria função de importação em um módulo, ou pode usar o módulo Exportador e usar sua função de importação. Em quase todos os casos, você usará o módulo Exportador para fornecer uma função de importação em vez de reinventar a roda. (Você aprenderá mais sobre isso na próxima seção.) Se você decidir não usar o módulo Exportador, você terá que escrever sua própria função de importação em cada módulo que você escreva. É muito mais fácil simplesmente usar o módulo Exportador e permitir que Perl faça o trabalho para você. O Módulo Sample Letter. pm A melhor maneira de ilustrar a semântica de como um módulo é usado no Perl é escrever um módulo simples e mostrar como usá-lo. Vamos tomar o exemplo de um tubarão de empréstimo local, Rudious Maximus, que simplesmente está cansado de digitar o mesmo pedido para cartas de pagamento. Sendo um ávido fã de computadores e Perl, Rudious leva os programadores preguiçosos e escreve um módulo Perl para ajudá-lo a gerar seus memorandos e cartas. Agora, em vez de digitar dentro de campos em um arquivo de modelo de memo, tudo o que ele tem a fazer é digitar algumas linhas para produzir sua nota agradável e ameaçadora. A Listagem 4.1 mostra o que ele tem que digitar. Listagem 4.1. Usando o módulo Letter. 1 usrbinperl - w 2 3 Descomente a linha abaixo para incluir o diretório atual em Inc. 4 push (Inc, pwd) 5 6 use Letter 7 8 Letter :: To (quotMar Gambling Manquot, quotThe money for Lucky Dog, Race 2quot) 9 Letter :: ClaimMoneyNice () 10 Letter :: ThankDem () 11 Letter :: Finish () A declaração Letter de uso está presente para forçar o intérprete Perl a incluir o código do módulo no programa aplicativo. O módulo deve estar localizado no diretório usrlibperl5, ou você pode colocá-lo em qualquer diretório listado na matriz Inc. A matriz Inc é a lista de diretórios que o intérprete Perl procurará ao tentar carregar o código para o módulo nomeado. A linha comentada (número 4) mostra como adicionar o diretório de trabalho atual para incluir o caminho. As próximas quatro linhas no arquivo geram o assunto para a carta. É o resultado da utilização do módulo Letter: Para: Mr. Gambling Man Fm: Rudious Maximus, Loan Shark Dt: Qua 7 de fevereiro 10:35:51 CST 1996 Re: O dinheiro para Lucky Dog, Race 2 Chegou à minha atenção Que sua conta está muito atrasada. Você vai nos pagar em breve Ou quer que eu venha ova Obrigado pelo seu apoio. O arquivo do módulo de letras é mostrado na Listagem 4.2. O nome do pacote é declarado na primeira linha. Como essas funções de módulos serão exportadas, uso o módulo Exportador. Portanto, a declaração usa o Exportador para herdar a funcionalidade do módulo Exportador. Outra etapa necessária é colocar a palavra Exportada na matriz ISA para permitir a procura de Exportados. pm. A matriz ISA é uma matriz especial dentro de cada pacote. Cada item na matriz lista onde mais procurar um método se não puder ser encontrado no pacote atual. A ordem em que os pacotes estão listados na matriz ISA é a ordem em que Perl procura símbolos não resolvidos. Uma classe que está listada na matriz ISA é referida como a classe base dessa classe específica. Perl irá armazenar em cache os métodos que faltam encontrados nas classes base para futuras referências. A modificação da matriz ISA irá eliminar o cache e fazer com que Perl procure todos os métodos novamente. Vejamos agora o código para Letter. pm na Listagem 4.2. Listagem 4.2. O módulo Letter. pm. 1 pacote Carta 2 3 requer Exportador 4 ISA (Exportador) 5 6 cabeça1 NOME 7 8 Carta - Módulo de amostra para gerar cabeçalho para você 9 10 cabeça1 SINOPSE 11 12 uso Carta 13 14 Carta :: Data () 15 Carta :: Para (nome , Empresa, endereço) 16 17 Então, um dos seguintes: 18 Letter :: ClaimMoneyNice () 19 Letter :: ClaimMoney () 20 Letter :: ThreatBreakLeg () 21 22 Letter :: ThankDem () 23 Letter :: Finish () 24 25 head1 DESCRIÇÃO 26 27 Este módulo fornece um pequeno exemplo de geração de uma carta para um 28 tubarão de empréstimo de vizinhança amigável. 29 30 O código começa após a instrução quotcutquot. 31 corte 32 33 EXPORTAÇÃO qw (Data, 34 Para, 35 ReclamoMoney, 36 ReclamoMoneyNice, 37 ThankDem, 38 Conclusão) 39 40 41 Imprimir data de hoje 42 43 sub Letter :: Data 44 data data 45 imprimir quotn Hoje é data 46 47 48 sub Carta :: Para 49 local (nome) deslocamento 50 local (assunto) mudança 51 imprimir quotn Para: nomequot 52 imprimir quotn Fm: Rudious Maximus, empréstimo Sharkquot 53 imprimir quotn Dt: quot, date 54 imprimir quotn Re: subjectquot 55 imprimir quotnnquot 56 Imprimir quotnnquot 57 58 sub Letter :: ClaimMoney () 59 imprimir quotn Você me deve dinheiro. Obtenha seu ato togetherquot 60 print quotn Você quer que eu envie Bruno para quot 61 print quotn cole-o. Ou você vai pagar a subscrição 62 63 64 sub Letter :: ClaimMoneyNice () 65 imprimir quotn Chegou a minha atenção que sua conta é quot 66 imprimir quotn way over due. quot 67 imprimir quotn Você vai nos pagar em breve ... não 68 Imprimir quotn ou você gostaria que eu venha ovahquot 69 70 71 sub Letter :: ThreatBreakLeg () 72 imprimir quotn aparentemente cartas como estas não ajudam 73 imprimir quotn Eu vou ter que fazer um exemplo de youquot 74 imprimir quotn n Ver você no hospital , Palquot 75 76 77 sub Letter :: ThankDem () 78 imprimir quotnn Obrigado pelo seu suporte 79 80 81 sub Letter :: Finish () 82 printf quotnnnn Sincerelyquot 83 printf quotn Rudious n 84 84 86 86 1 Linhas que contêm o sinal de igualdade são usadas Para documentação. Você deve documentar cada módulo para sua própria referência. Os módulos Perl não precisam ser documentados, mas é uma boa idéia escrever algumas linhas sobre o que seu código faz. Daqui a poucos anos, você pode esquecer sobre o que é um módulo. Uma boa documentação é sempre uma obrigação se você quiser lembrar o que fez no passado. Eu cobrem os estilos de documentação usados ​​para o Perl no Capítulo 8. quotDocumenting Perl Scripts. quot Para este módulo de exemplo, a declaração head1 inicia a documentação. Tudo para a declaração de corte é ignorado pelo intérprete Perl. Em seguida, o módulo lista todas as funções exportadas por este módulo na matriz EXPORT. A matriz EXPORT define todos os nomes das funções que podem ser chamados pelo código externo. Se você não listar uma função nesta matriz EXPORT, não será visto por módulos de código externos. Seguir a matriz EXPORT é o corpo do código, uma sub-rotina de cada vez. Depois de todas as sub-rotinas serem definidas, a declaração final 1 encerra o arquivo do módulo. 1 deve ser a última linha executável no arquivo. Vejamos algumas das funções definidas neste módulo. A primeira função a observar é a função Data simples, as linhas 43 a 46, que imprime a data e a hora do UNIX atual. Não há parâmetros para esta função, e ele não retorna nada significativo de volta ao chamador. Observe o uso da minha antes da variável de data na linha 44. A minha palavra-chave é usada para limitar o escopo da variável dentro das chaves de curvatura das funções da Data. O código entre chaves é conhecido como um bloco. As variáveis ​​declaradas dentro de um bloco são limitadas no escopo dentro das chaves curly. Em 49 e 50, o nome e o assunto das variáveis ​​locais são visíveis para todas as funções. Você também pode declarar variáveis ​​com o qualificador local. O uso do local permite que uma variável esteja no escopo para o bloco atual, bem como para outros blocos de código chamados de dentro deste bloco. Assim, um x local declarado dentro de um bloco é visível para todos os blocos subseqüentes chamados de dentro deste bloco e podem ser referenciados. No código de exemplo a seguir, a variável de nome de funções ToTitled pode ser acessada, mas não os dados no iphone. 1 sub Letter :: ToTitled 2 local (name) shift 3 my (phone) shift O código de exemplo para Letter. pm mostrou como extrair um parâmetro por vez. A sub-rotina To () leva dois parâmetros para configurar o cabeçalho do memorando. O uso de funções dentro de um módulo não é diferente de usar e definir módulos Perl dentro do mesmo arquivo de código. Os parâmetros são passados ​​por referência, a menos que especificado de outra forma. As múltiplas matrizes passadas para uma sub-rotina, se não for explicitamente desreferenciada usando a barra invertida, são concatenadas. A matriz de entrada em uma função é sempre uma matriz de valores escalares. Passar valores por referência é a maneira preferida em Perl para passar uma grande quantidade de dados em uma sub-rotina. (Consulte o Capítulo 3. quotReferences. quot) Outro módulo de exemplo: Finanças O módulo Finanças, mostrado na Listagem 4.3, é usado para fornecer cálculos simples para valores de empréstimo. Usar o módulo Finanças é direto. Todas as funções são escritas com os mesmos parâmetros, conforme mostrado na fórmula para as funções. Vamos ver como o valor futuro de um investimento pode ser calculado. Por exemplo, se você investir alguns dólares, pv. Em uma ligação que oferece uma taxa de porcentagem fixa, r. Aplicado em intervalos conhecidos para n períodos de tempo, qual é o valor da ligação no momento da expiração. Neste caso, você estará usando a seguinte fórmula: fv pv (1r) n A função para obter o valor futuro é declarada como FutureValue . Consulte o Listado 4.3 para ver como usá-lo. Lista 4.3. Usando o módulo Finanças. 1 usrbinperl - w 2 3 push (Inc, pwd) 4 uso Finanças 5 6 empréstimo 5000.00 7 apr 3.5 APR 8 ano 10 em anos. 9 10 ------------------------------------------------ ---------------- 11 Calcule o valor no final do empréstimo se o interesse 12 for aplicado todos os anos. 13 ------------------------------------------------- --------------- 14 time-year 15 fv1 Finanças :: FutureValue (empréstimo, abril, hora) 16 imprimir quotn Se o interesse for aplicado no final do ano 17 imprimir quotn O valor futuro para um Empréstimo de quot. empréstimo. Quotnquot 18 imprime quot em um APR de quot, apr. Quot for quot, time, quot yearsquot 19 printf quot is 8.2f nquot. Fv1 20 21 ----------------------------------------------- ----------------- 22 Calcule o valor no final do empréstimo se o interesse 23 for aplicado todos os meses. 24 ------------------------------------------------- --------------- 25 taxa 12 de abril APR 26 horário 12 em meses 27 fv2 Finanças :: FutureValue (empréstimo, taxa e tempo) 28 29 imprimir quotn Se o interesse for aplicado no final de Cada mês 30 imprimir quotn O valor futuro para um empréstimo de quot. empréstimo. Quotnot 31 imprimir quot em um APR de quot, apr. Quot for quot, time, quot monthsquot 32 printf quot is 8.2f nquot. Fv2 33 34 printf quotn A diferença de valor é 8.2fquot, fv2 - fv1 35 printf quotn Portanto, ao aplicar o interesse em períodos de tempo mais curtos, 36 imprimir o quotn estamos realmente recebendo mais dinheiro em interesse. nquot Aqui está o exemplo de entrada e saída do Listado 4.3. Testme Se os juros forem aplicados no final do ano O valor futuro para um empréstimo de 5000 em um APR de 3,5 para 10 anos é de 7052.99 Se os juros forem aplicados no final de cada mês O valor futuro de um empréstimo de 5000 em um APR de 3,5 para 120 meses é 7091.72 A diferença de valor é 38.73 Portanto, ao aplicar o interesse em períodos de tempo mais curtos, estamos realmente recebendo mais dinheiro em interesse. A revelação na saída é o resultado da comparação de valores entre fv1 e fv2. O valor fv1 é calculado com a aplicação de interesse uma vez por ano durante a vida do vínculo. Fv2 é o valor se o interesse é aplicado a cada mês na taxa de juros mensal equivalente. O pacote Finance. pm é mostrado na Listagem 4.4 nas fases iniciais de desenvolvimento. Lista 4.4. O pacote Finance. pm. 1 pacote Finanças 2 3 requerem Exportador 4 ISA (Exportador) 5 6 head1 Finance. pm 7 8 Calculadora Financeira - Cálculos financeiros facilitados com Perl 9 10 cabeça 2 11 uso Finanças 12 13 pv 10000.0 14 15 taxa 12,5 12 TAEG por mês. 16 17 tempo 360 meses para empréstimo para amadurecer 18 19 fv FutureValue () 20 21 imprimir fv 22 23 cortar 24 25 EXPORTAR qw (FutureValue, 26 PresentValue, 27 FVofAnnuity, 28 AnnuityOfFV, 29 getLastAverage, 30 getMovingAverage, 31 SetInterest) 32 33 34 Globals, se houver 35 36 37 local defaultInterest 5.0 38 39 sub Finance :: SetInterest () 40 my rate shift () 41 defaultInterest rate 42 printf quotn defaultInterest ratequot 43 44 45 -------------- -------------------------------------------------- ---- 46 Notas: 47 1. A taxa de juros r é dada em um valor de 0-100. 48 2. O n dado nos termos é a taxa em que o interesse 49 é aplicado. 50 51 ------------------------------------------------ -------------------- 52 53 ---------------------------- ---------------------------------------- 54 Valor atual de um investimento dado 55 fv - Um valor futuro 56 r - taxa por período 57 n - número de período 58 ---------------------------------- ---------------------------------- 59 sub Finance :: FutureValue () 60 my (pv, r, n ) 61 my fv pv ((1 (r100)) n) 62 return fv 63 64 65 ------------------------------ -------------------------------------- 66 Valor presente de um investimento dado 67 fv - um futuro Valor 68 r - taxa por período 69 n - número de período 70 ------------------------------------ -------------------------------- 71 sub Finance :: PresentValue () 72 my pv 73 my (fv, r, N) 74 pv fv ((1 (r100)) n) 75 retorno pv 76 77 78 79 ----------------------------- --------------------------------------- 80 Obter o valor futuro de uma anuidade dada 81 mp - Pagamento mensal da anuidade 82 r - taxa por período 83 n - número o F período 84 ----------------------------------------------- --------------------- 85 86 sub FVofAnnuity () 87 my fv 88 my oneR 89 my (mp, r, n) 90 91 oneR (1 r) n 92 fv mp ((oneR - 1) r) 93 retorno fv 94 95 96 --------------------------------- ----------------------------------- 97 Obter a anuidade dos seguintes bits de informação 98 r - taxa por Período 99 n - número de período 100 fv - Valor futuro 101 ------------------------------------- ------------------------------- 102 103 sub AnnuityOfFV () 104 my mp mp - Pagamento mensal da anuidade 105 my oneR 106 My (fv, r, n) 107 108 oneR (1 r) n 109 mp fv (r (oneR-1)) 110 retorno mp 111 112 113 ----------------- -------------------------------------------------- - 114 Obter a média dos últimos valores quotnquot em uma matriz. 115 ------------------------------------------------- ------------------- 116 O último número de contagem de elementos da matriz em valores 117 O número total de elementos em valores está no número 118 119 sub getLastAverage () 120 my (Contagem, número, valores) 121 my i 122 123 my a 0 124 retorno 0 se (contagem 0) 125 para (i 0 ilt count i) 126 um número de valores - i - 1 127 128 retornar uma contagem 129 130 131 --- -------------------------------------------------- --------------- 132 Obter uma média móvel dos valores. 133 ------------------------------------------------- ------------------- 134 O tamanho da janela é o primeiro parâmetro, o número de itens na matriz passada 135 é o próximo. (Isso pode ser facilmente calculado dentro da função 136 usando a função scalar (), mas a sub-rotina mostrada aqui 137 também está sendo usada para ilustrar como passar ponteiros.) A referência à matriz 138 de valores é passada a seguir, seguida de um Referência ao lugar 139, os valores de retorno devem ser armazenados. 140 141 sub getMovingAve () 142 my (contagem, número, valores, motionAve) 143 meu i 144 meu a 0 145 meu v 0 146 147 retorno 0 se (contagem 0) 148 retorno -1 se (número de contagem gt) 149 retornar - 2 se (count lt 2) 150 151 moveAve0 0 152 movingAvenumber - 1 0 153 para (i0 iltcounti) 154 v valuesi 155 av count 156 movingAvei 0 157 158 para (icount iltnumberi) 159 v valuesi 160 av count 161 v valuesi - count - 1 162 a - v count 163 movingAvei a 164 165 return 0 166 167 168 1 Consulte a declaração da função FutureValue com (). Os sinais de três dólares juntos significam que três números escalares passaram para a função. Este escopo extra está presente para validar o tipo de parâmetros passados ​​para a função. Se você fosse passar uma string em vez de um número na função, você receberia uma mensagem muito semelhante a esta: Demasiados argumentos para Finanças :: FutureValue na. f4.pl linha 15, quase quottime) quot Execução de. f4.pl abortado devido a erros de compilação. O uso de protótipos ao definir funções impede o envio de valores diferentes do que a função espera. Use ou para passar em uma série de valores. Se você está passando por referência, use ou para mostrar uma referência escalar para uma matriz ou hash, respectivamente. Se você não usar a barra invertida, todos os outros tipos no protótipo da lista de argumentos serão ignorados. Outros tipos de desqualificadores incluem um e comercial para uma referência a uma função, um asterisco para qualquer tipo e um ponto e vírgula para indicar que todos os outros parâmetros são opcionais. Agora, olhe para a última declaração de função MovingAverage, que especifica dois números inteiros na frente seguido de uma matriz. A maneira como os argumentos são usados ​​na função é atribuir um valor a cada um dos dois escalares, contagem e número. Enquanto tudo o resto é enviado para a matriz. Olhe para a função getMovingAverage () para ver como dois arrays são passados ​​para obter a média móvel em uma lista de valores. A maneira de chamar a função getMovingAverage é mostrada na Listagem 4.5. Listagem 4.5. Usando a função de média móvel. 1 usrbinperl - w 2 3 push (Inc, pwd) 4 use Finance 5 6 valores (12,22,23,24,21,23,24,23,23,21,29,27,26,28) 7 mv ( 0) 8 tamanho escalar (valores) 9 imprimir quotn Valores para trabalhar com nquot 10 imprimir quot Número de valores tamanho nquot 11 12 ------------------------ ---------------------------------------- 13 Calcular a média da função acima 14 - -------------------------------------------------- ------------- 15 ave Finanças :: getLastAverage (5, tamanho, valores) 16 imprimir quotn Média dos últimos 5 dias ave nquot 17 18 Finanças :: getMovingAve (5, tamanho, valores, mv ) 19 imprimir quotn Média móvel com janela de 5 dias n nquot Heres o resultado da Lista 4.5: Valores para trabalhar com Número de valores 14 Média dos últimos 5 dias 26.2 A função getMovingAverage () leva dois escalares e duas referências a arrays como escalares. Dentro da função, os dois escalares para os arrays são desreferenciados para serem usados ​​como matrizes numéricas. O conjunto de valores retornado é inserido na área passada como segunda referência. Se os parâmetros de entrada não tivessem sido especificados para cada matriz referenciada, a referência da matriz movingAve teria sido vazia e teria causado erros no tempo de execução. Em outras palavras, a seguinte declaração não está correta: sub getMovingAve () O vomité resultante das mensagens de erro de um protótipo de função ruim é o seguinte: Uso do valor não inicializado na linha Finance. pm 128. Uso do valor não inicializado na linha Finance. pm 128. Uso do valor não inicializado na linha Finance. pm 128. Uso do valor não inicializado na linha Finance. pm 128. Uso do valor não inicializado na linha Finance. pm 128. Uso do valor não inicializado na linha Finance. pm 133. Uso do valor não inicializado Na linha Finance. pm 135. Uso do valor não inicializado na linha Finance. pm 133. Uso do valor não inicializado na linha Finance. pm 135. Uso do valor não inicializado na linha Finance. pm 133. Uso do valor não inicializado na linha Finance. pm 135 Uso do valor não inicializado na linha Finance. pm 133. Uso do valor não inicializado na linha Finance. pm 135. Uso do valor não inicializado na linha Finance. pm 133. Uso do valor não inicializado na linha 135 Finance. pm. Uso do valor não inicializado em Linha Finance. pm 133. Uso de valor não inicializado e at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Use of uninitialized value at Finance. pm line 133. Use of uninitialized value at Finance. pm line 135. Average of last 5 days 26.2 Moving Average with 5 days window This is obviously not the correct output. Therefore, its critical that you pass by reference when sending more than one array. Global variables for use within the package can also be declared. Look at the following segment of code from the Finance. pm module to see what the default value of the Interest variable would be if nothing was specified in the input. (The current module requires the interest to be passed in, but you can change this.) Heres a little snippet of code that can be added to the end of the program shown in Listing 4.5 to add the ability to set interest rates. 20 local defaultInterest 5.0 21 sub Finance::SetInterest() 22 my rate shift() 23 rate -1 if (rate lt 0) 24 defaultInterest rate 25 printf quotn defaultInterest ratequot 26 The local variable defaultInterest is declared in line 20. The subroutine SetInterest to modify the rate is declared in lines 21 through 26. The rate variable uses the values passed into the subroutine and simply assigns a positive value for it. You can always add more error checking if necessary. To access the defaultInterest variables value, you could define either a subroutine that returns the value or refer to the value directly with a call to the following in your application program: Finance::defaultInterest The variable holding the return value from the module function is declared as my variable . The scope of this variable is within the curly braces of the function only. When the called subroutine returns, the reference to my variable is returned. If the calling program uses this returned reference somewhere, the link counter on the variable is not zero therefore, the storage area containing the returned values is not freed to the memory pool. Thus, the function that declares my pv and then later returns the value of pv returns a reference to the value stored at that location. If the calling routine performs a call like this one: Finance::FVofAnnuity(monthly, rate, time) there is no variable specified here into which Perl stores the returned reference therefore, any returned value (or a list of values) is destroyed. Instead, the call with the returned value assigned to a local variable, such as this one: fv Finance::FVofAnnuity(monthly, rate, time) maintains the variable with the value. Consider the example shown in Listing 4.6, which manipulates values returned by functions. Listing 4.6. Sample usage of the my function. 1 usrbinperl - w 2 3 push(Inc, pwd) 4 use Finance 5 6 monthly 400 7 rate 0.2 i. e. 6 APR 8 time 36 in months 9 10 print quotn ------------------------------------------------quot 11 fv Finance::FVofAnnuity(monthly, rate, time) 12 printf quotn For a monthly 8.2f at a rate of 6.2f for d periodsquot, 13 monthly, rate, time 14 printf quotn you get a future value of 8.2f quot, fv 15 16 fv 1.1 allow 10 gain in the house value. 17 18 mo Finance::AnnuityOfFV(fv, rate, time) 19 20 printf quotn To get 10 percent more at the end, i. e. 8.2fquot, fv 21 printf quotn you need a monthly payment value of 8.2fquot, mo, fv 22 23 print quotn ------------------------------------------------ nquot Here is sample input and output for this function: testme ------------------------------------------------ For a monthly 400.00 at a rate of 0.20 for 36 periods you get a future value of 1415603.75 To get 10 percent more at the end, i. e. 1557164.12 you need a monthly payment value of 440.00 ------------------------------------------------ Modules implement classes in a Perl program that uses the object-oriented features of Perl. Included in object-oriented features is the concept of inheritance . (Youll learn more on the object-oriented features of Perl in Chapter 5. quotObject-Oriented Programming in Perl. quot) Inheritance means the process with which a module inherits the functions from its base classes. A module that is nested within another module inherits its parent modules functions. So inheritance in Perl is accomplished with the :: construct. Heres the basic syntax: SuperClass::NextSubClass. ThisClass. The file for these is stored in. SuperClassNextSubClass133 . Each double colon indicates a lower-level directory in which to look for the module. Each module, in turn, declares itself as a package with statements like the following: package SuperClass::NextSubClass package SuperClass::NextSubClass::EvenLower For example, say that you really want to create a Money class with two subclasses, Stocks and Finance . Heres how to structure the hierarchy, assuming you are in the usrlibperl5 directory: Create a Money directory under the usrlibperl5 directory. Copy the existing Finance. pm file into the Money subdirectory. Create the new Stocks. pm file in the Money subdirectory. Edit the Finance. pm file to use the line package Money::Finance instead of package Finance . Edit scripts to use Money::Finance as the subroutine prefix instead of Finance:: . Create a Money. pm file in the usrlibperl5 directory. The Perl script that gets the moving average for a series of numbers is presented in Listing 4.7. Listing 4.7. Using inheriting modules. 1 usrbinperl - w 2 aa pwd 3 aa . quotMoneyquot 4 push(Inc, aa) 5 use Money::Finance 6 values ( 12,22,23,24,21,23,24,23,23,21,29,27,26,28 ) 7 mv (0) 8 size scalar(values) 9 print quotn Values to work with nquot 10 print quot Number of values size nquot 11 ---------------------------------------------------------------- 12 Calculate the average of the above function 13 ---------------------------------------------------------------- 14 ave Money::Finance::getLastAverage(5,size, values) 15 print quotn Average of last 5 days ave nquot 16 Money::Finance::getMovingAve(5,size, values, mv) 17 foreach i (values) 18 print quotn Moving with 5 days window mvi nquot 19 20 print quotn Moving Average with 5 days window n nquot Lines 2 through 4 add the path to the Money subdirectory. The use statement in line 5 now addresses the Finance. pm file in the. Money subdirectory. The calls to the functions within Finance. pm are now called with the prefix Money::Finance:: instead of Finance:: . Therefore, a new subdirectory is shown via the :: symbol when Perl is searching for modules to load. The Money. pm file is not required. Even so, you should create a template for future use. Actually, the file would be required to put any special requirements for initialization that the entire hierarchy of modules uses. The code for initialization is placed in the BEGIN() function. The sample Money. pm file is shown in Listing 4.8. Listing 4.8. The superclass module for Finance. pm . 1 package Money 2 require Exporter 3 4 BEGIN 5 printf quotn Hello Zipping into existence for younquot 6 7 1 To see the line of output from the printf statement in line 5, you have to insert the following commands at the beginning of your Perl script: use Money use Money::Finance To use the functions in the Stocks. pm module, you use this line: use Money::Stocks The Stocks. pm file appears in the Money subdirectory and is defined in the same format as the Finance. pm file, with the exceptions that use Stocks is used instead of use Finance and the set of functions to export is different. A number of modules are included in the Perl distribution. Check the usrlibperl5lib directory for a complete listing after you install Perl. There are two kinds of modules you should know about and look for in your Perl 5 release, Pragmatic and Standard modules. Pragmatic modules, which are also like pragmas in C compiler directives, tend to affect the compilation of your program. They are similar in operation to the preprocessor elements of a C program. Pragmas are locally scoped so that they can be turned off with the no command. Thus, the command no POSIX turns off the POSIX features in the script. These features can be turned back on with the use statement. Standard modules bundled with the Perl package include several functioning packages of code for you to use. Refer to appendix B, quotPerl Module Archives, quot for a complete list of these standard modules. To find out all the. pm modules installed on your system, issue the following command. (If you get an error, add the usrlibperl5 directory to your path.) find usrlibperl5 - name perl quot. pmquot - print Extension modules are written in C (or a mixture of Perl and C) and are dynamically loaded into Perl if and when you need them. These types of modules for dynamic loading require support in the kernel. Solaris lets you use these modules. For a Linux machine, check the installation pages on how to upgrade to the ELF format binaries for your Linux kernel. The term CPAN (Comprehensive Perl Archive Network) refers to all the hosts containing copies of sets of data, documents, and Perl modules on the Net. To find out about the CPAN site nearest you, search on the keyword CPAN in search engines such as Yahoo. AltaVista, or Magellan. A good place to start is the metronet site . This chapter introduced you to Perl 5 modules and described what they have to offer. A more comprehensive list is found on the Internet via the addresses shown in the Web sites metronet and perl . A Perl package is a set of Perl code that looks like a library file. A Perl module is a package that is defined in a library file of the same name. A module is designed to be reusable. You can do some type checking with Perl function prototypes to see whether parameters are being passed correctly. A module has to export its functions with the EXPORT array and therefore requires the Exporter module. Modules are searched for in the directories listed in the Inc array. Obviously, there is a lot more to writing modules for Perl than what is shown in this chapter. The simple examples in this chapter show you how to get started with Perl modules. In the rest of the book I cover the modules and their features, so hang in there. I cover Perl objects, classes, and related concepts in Chapter 5.The belief that a change will be easy to do correctly makes it less likely that the change will be done correctly. An XP programmer writes a unit test to clarify his intentions before he makes a change. We call this test-driven design (TDD) or test-first programming . because an API39s design and implementation are guided by its test cases. The programmer writes the test the way he wants the API to work, and he implements the API to fulfill the expectations set out by the test. Test-driven design helps us invent testable and usable interfaces. In many ways, testability and usability are one in the same. If you can39t write a test for an API, it39ll probably be difficult to use, and vice-versa. Test-driven design gives feedback on usability before time is wasted on the implementation of an awkward API. As a bonus, the test documents how the API works, by example. All of the above are good things, and few would argue with them. One obvious concern is that test-driven design might slow down development. It does take time to write tests, but by writing the tests first, you gain insight into the implementation, which speeds development. Debugging the implementation is faster, too, thanks to immediate and reproducible feedback that only an automated test can provide. Perhaps the greatest time savings from unit testing comes a few months or years after you write the test, when you need to extend the API. The unit test not only provides you with reliable documentation for how the API works, but it also validates the assumptions that went into the design of the API. You can be fairly sure a change didn39t break anything if the change passes all the unit tests written before it. Changes that fiddle with fundamental API assumptions cause the costliest defects to debug. A comprehensive unit test suite is probably the most effective defense against such unwanted changes. This chapter introduces test-driven design through the implementation of an exponential moving average (EMA), a simple but useful mathematical function. This chapter also explains how to use the CPAN modules Test::More and Test::Exception . Unit Tests A unit test validates the programmer39s view of the application. This is quite different from an acceptance test, which is written from the customer39s perspective and tests end-user functionality, usually through the same interface that an ordinary user uses. In constrast, a unit test exercises an API, formally known as a unit. Usually, we test an entire Perl package with a single unit test. Perl has a strong tradition of unit testing, and virtually every CPAN module comes with one or more unit tests. There are also many test frameworks available from CPAN. This and subsequent chapters use Test::More . a popular and well documented test module.2 I also use Test::Exception to test deviance cases that result in calls to die .3 Test First, By Intention Test-driven design takes unit testing to the extreme. Before you write the code, you write a unit test. For example, here39s the first test case for the EMA (exponential moving average) module: This is the minimal Test::More test. You tell Test::More how many tests to expect, and you import the module with useok as the first test case. The BEGIN ensures the module39s prototypes and functions are available during compilation of the rest of the unit test. The next step is to run this test to make sure that it fails: At this stage, you might be thinking, Duh Of course, it fails. Test-driven design does involve lots of duhs in the beginning. The baby steps are important, because they help to put you in the mindset of writing a small test followed by just enough code to satisfy the test. If you have maintenance programming experience, you may already be familiar with this procedure. Maintenance programmers know they need a test to be sure that their change fixes what they think is broken. They write the test and run it before fixing anything to make sure they understand a failure and that their fix works. Test-driven design takes this practice to the extreme by clarifying your understanding of all changes before you make them. Now that we have clarified the need for a module called EMA (duh), we implement it: And, duh, the test passes: Yeeha Time to celebrate with a double cappuccino so we don39t fall asleep. That39s all there is to the test-driven design loop: write a test, see it fail, satisfy the test, and watch it pass. For brevity, the rest of the examples leave out the test execution steps and the concomitant duhs and yeehas. However, it39s important to remember to include these simple steps when test-first programming. If you don39t remember, your programming partner probably will.4 Exponential Moving Average Our hypothetical customer for this example would like to maintain a running average of closing stock prices for her website. An EMA is commonly used for this purpose, because it is an efficient way to compute a running average. You can see why if you look at the basic computation for an EMA: today39s price x weight yesterday39s average x (1 - weight) This algorithm produces a weighted average that favors recent history. The effect of a price on the average decays exponentially over time. It39s a simple function that only needs to maintain two values: yesterday39s average and the weight. Most other types of moving averages, require more data storage and more complex computations. The weight, commonly called alpha . is computed in terms of uniform time periods (days, in this example): 2 (number of days 1) For efficiency, alpha is usually computed once, and stored along with the current value of the average. I chose to use an object to hold these data and a single method to compute the average. Test Things That Might Break Since the first cut design calls for a stateful object, we need to instantiate it to use it. The next case tests object creation: I sometimes forget to return the instance ( self ) so the test calls ok to check that new returns some non-zero value. This case tests what I think might break. An alternative, more extensive test is: This case checks that new returns a blessed reference of class EMA . To me, this test is unnecessarily complex. If new returns something, it39s probably an instance. It39s reasonable to rely on the simpler case on that basis alone. Additionally, there will be other test cases that will use the instance, and those tests will fail if new doesn39t return an instance of class EMA . This point is subtle but important, because the size of a unit test suite matters. The larger and slower the suite, the less useful it will be. A slow unit test suite means programmers will hesitate before running all the tests, and there will be more checkins which break unit andor acceptance tests. Remember, programmers are lazy and impatient, and they don39t like being held back by their programming environment. When you test only what might break, your unit test suite will remain a lightweight and effective development tool. Please note that if you and your partner are new to test-driven design, it39s probably better to err on the side of caution and to test too much. With experience, you39ll learn which tests are redundant and which are especially helpful. There are no magic formulas here. Testing is an art that takes time to master. Satisfy The Test, Don39t Trick It Returning to our example, the implementation of new that satisfies this case is: This is the minimal code which satisfies the above test. length doesn39t need to be stored, and we don39t need to compute alpha. We39ll get to them when we need to. But wait, you say, wouldn39t the following code satisfy the test, too Yes, you can trick any test. However, it39s nice to treat programmers like grown-ups (even though we don39t always act that way). No one is going to watch over your shoulder to make sure you aren39t cheating your own test. The first implementation of new is the right amount of code, and the test is sufficient to help guide that implementation. The design calls for an object to hold state, and an object creation is what needed to be coded. Test Base Cases First What we39ve tested thus far are the base cases . that is, tests that validate the basic assumptions of the API. When we test basic assumptions first, we work our way towards the full complexity of the complete implementation, and it also makes the test more readable. Test-first design works best when the implementation grows along with the test cases. There are two base cases for the compute function. The first base case is that the initial value of the average is just the number itself. There39s also the case of inputting a value equal to the average, which should leave the average unchanged. These cases are coded as follows: The is function from Test::More lets us compare scalar values. Note the change to the instantiation test case that allows us to use the instance ( ema ) for subsequent cases. Reusing results of previous tests shortens the test, and makes it easier to understand. The implementation that satisfies these cases is: The initialization of alpha was added to new . because compute needs the value. new initializes the state of the object, and compute implements the EMA algorithm. self-gt is initially undef so that case can be detected. Even though the implementation looks finished, we aren39t done testing. The above code might be defective. Both compute test cases use the same value, and the test would pass even if, for example, self-gt and value were accidentally switched. We also need to test that the average changes when given different values. The test as it stands is too static, and it doesn39t serve as a good example of how an EMA works. Choose Self-Evident Data In a test-driven environment, programmers use the tests to learn how the API works. You may hear that XPers don39t like documentation. That39s not quite true. What we prefer is self-validating documentation in the form of tests. We take care to write tests that are readable and demonstrate how to use the API. One way to create readable tests is to pick good test data. However, we have a little bootstrapping problem: To pick good test data, we need valid values from the results of an EMA computation, but we need an EMA implementation to give us those values. One solution is to calculate the EMA values by hand. Or, we could use another EMA implementation to come up with the values. While either of these choices would work, a programmer reading the test cases would have to trust them or to recompute them to verify they are correct. Not to mention that we39d have to get the precision exactly right for our target platform. Use The Algorithm, Luke A better alternative is to work backwards through the algorithm to figure out some self-evident test data.5 To accomplish this, we treat the EMA algorithm as two equations by fixing some values. Our goal is to have integer values for the results so we avoid floating point precision issues. In addition, integer values make it easier for the programmer to follow what is going on. When we look at the equations, we see alpha is the most constrained value: today39s average today39s price x alpha yesterday39s average x (1 - alpha) alpha 2 (length 1) Therefore it makes sense to try and figure out a value of alpha that can produce integer results given integer prices. Starting with length 1, the values of alpha decrease as follows: 1, 23, 12, 25, 13, 27, and 14. The values 1, 12, and 25 are good candidates, because they can be represented exactly in binary floating point. 1 is a degenerate case, the average of a single value is always itself. 12 is not ideal, because alpha and 1 - alpha are identical, which creates a symmetry in the first equation: today39s average today39s price x 0.5 yesterday39s average x 0.5 We want asymmetric weights so that defects, such as swapping today39s price and yesterday39s average, will be detected. A length of 4 yields an alpha of 25 (0.4), and makes the equation asymmetric: today39s average today39s price x 0.4 yesterday39s average x 0.6 With alpha fixed at 0.4, we can pick prices that make today39s average an integer. Specifically, multiples of 5 work nicely. I like prices to go up, so I chose 10 for today39s price and 5 for yesterday39s average. (the initial price). This makes today39s average equal to 7, and our test becomes: Again, I revised the base cases to keep the test short. Any value in the base cases will work so we might as well save testing time through reuse. Our test and implementation are essentially complete. All paths through the code are tested, and EMA could be used in production if it is used properly. That is, EMA is complete if all we care about is conformant behavior. The implementation currently ignores what happens when new is given an invalid value for length . Although EMA is a small part of the application, it can have a great impact on quality. For example, if new is passed a length of -1, Perl throws a divide-by-zero exception when alpha is computed. For other invalid values for length . such as -2, new silently accepts the errant value, and compute faithfully produces non-sensical values (negative averages for positive prices). We can39t simply ignore these cases. We need to make a decision about what to do when length is invalid. One approach would be to assume garbage-in garbage-out. If a caller supplies -2 for length . it39s the caller39s problem. Yet this isn39t what Perl39s divide function does, and it isn39t what happens, say, when you try to de-reference a scalar which is not a reference. The Perl interpreter calls die . and I39ve already mentioned in the Coding Style chapter that I prefer failing fast rather than waiting until the program can do some real damage. In our example, the customer39s web site would display an invalid moving average, and one her customers might make an incorrect investment decision based on this information. That would be bad. It is better for the web site to return a server error page than to display misleading and incorrect information. Nobody likes program crashes or server errors. Yet calling die is an efficient way to communicate semantic limits (couplings) within the application. The UI programmer, in our example, may not know that an EMA39s length must be a positive integer. He39ll find out when the application dies. He can then change the design of his code and the EMA class to make this limit visible to the end user. Fail fast is an important feedback mechanism. If we encounter an unexpected die . it tells us the application design needs to be improved. Deviance Testing In order to test for an API that fails fast, we need to be able to catch calls to die and then call ok to validate the call did indeed end in an exception. The function diesok in the module Test::Exception does this for us. Since this is our last group of test cases in this chapter, here39s the entire unit test with the changeds for the new deviance cases highlighted: There are now 9 cases in the unit test. The first deviance case validates that length can39t be negative. We already know -1 will die with a divide-by-zero exception so -2 is a better choice. The zero case checks the boundary condition. The first valid length is 1. Lengths must be integers, and 2.5 or any other floating point number is not allowed. length has no explicit upper limit. Perl automatically converts integers to floating point numbers if they are too large. The test already checks that floating point numbers are not allowed so no explicit upper limit check is required. The implementation that satisfies this test follows: The only change is the addition of a call to die with an unless clause. This simple fail fast clause doesn39t complicate the code or slow down the API, and yet it prevents subtle errors by converting an assumption into an assertion. Only Test The New API One of the most difficult parts of testing is to know when to stop. Once you have been test-infected, you may want to keep on adding cases to be sure that the API is perfect. For example, a interesting test case would be to pass a NaN (Not a Number) to compute . but that39s not a test of EMA . The floating point implementation of Perl behaves in a particular way with respect to NaNs6. and Bivio::Math::EMA will conform to that behavior. Testing that NaNs are handled properly is a job for the Perl interpreter39s test suite. Every API relies on a tremendous amount of existing code. There isn39t enough time to test all the existing APIs and your new API as well. Just as an API should separate concerns so must a test. When testing a new API, your concern should be that API and no others. Solid Foundation In XP, we do the simplest thing that could possibly work so we can deliver business value as quickly as possible. Even as we write the test and implementation, we39re sure the code will change. When we encounter a new customer requirement, we refactor the code, if need be, to facilitate the additional function. This iterative process is called continuous design . which is the subject of the next chapter. It39s like renovating your house whenever your needs change. 7 A system or house needs a solid foundation in order to support continuous renovation. Unit tests are the foundation of an XP project. When designing continuously, we make sure the house doesn39t fall down by running unit tests to validate all the assumptions about an implementation. We also grow the foundation before adding new functions. Our test suite gives us the confidence to embrace change. Quality Software Management: Vol. 1 Systems Thinking . Gerald Weinberg, Dorset House, 1991, p. 236. Part of the Test-Simple distribution, available at search. cpan. orgsearchqueryTest-Simple I used version 0.47 for this book. Just a friendly reminder to program in pairs, especially when trying something new. Thanks to Ion Yadigaroglu for teaching me this technique. In some implementations, use of NaNs will cause a run-time error. In others, they will cause all subsequent results to be a NaN. Don39t let the thought of continuous house renovation scare you off. Programmers are much quieter and less messy than construction workers. Perl - Subroutines A Perl subroutine or function is a group of statements that together performs a task. You can divide up your code into separate subroutines. How you divide up your code among different subroutines is up to you, but logically the division usually is so each function performs a specific task. Perl uses the terms subroutine, method and function interchangeably. Define and Call a Subroutine The general form of a subroutine definition in Perl programming language is as follows minus The typical way of calling that Perl subroutine is as follows minus In versions of Perl before 5.0, the syntax for calling subroutines was slightly different as shown below. This still works in the newest versions of Perl, but it is not recommended since it bypasses the subroutine prototypes. Lets have a look into the following example, which defines a simple function and then call it. Because Perl compiles your program before executing it, it doesnt matter where you declare your subroutine. When above program is executed, it produces the following result minus Passing Arguments to a Subroutine You can pass various arguments to a subroutine like you do in any other programming language and they can be acessed inside the function using the special array . Thus the first argument to the function is in 0, the second is in 1, and so on. You can pass arrays and hashes as arguments like any scalar but passing more than one array or hash normally causes them to lose their separate identities. So we will use references ( explained in the next chapter ) to pass any array or hash. Lets try the following example, which takes a list of numbers and then prints their average minus When above program is executed, it produces the following result minus Passing Lists to Subroutines Because the variable is an array, it can be used to supply lists to a subroutine. However, because of the way in which Perl accepts and parses lists and arrays, it can be difficult to extract the individual elements from . If you have to pass a list along with other scalar arguments, then make list as the last argument as shown below minus When above program is executed, it produces the following result minus Passing Hashes to Subroutines When you supply a hash to a subroutine or operator that accepts a list, then hash is automatically translated into a list of keyvalue pairs. For example minus When above program is executed, it produces the following result minus Returning Value from a Subroutine You can return a value from subroutine like you do in any other programming language. If you are not returning a value from a subroutine then whatever calculation is last performed in a subroutine is automatically also the return value. You can return arrays and hashes from the subroutine like any scalar but returning more than one array or hash normally causes them to lose their separate identities. So we will use references ( explained in the next chapter ) to return any array or hash from a function. Lets try the following example, which takes a list of numbers and then returns their average minus When above program is executed, it produces the following result minus Private Variables in a Subroutine By default, all variables in Perl are global variables, which means they can be accessed from anywhere in the program. But you can create private variables called lexical variables at any time with the my operator. The my operator confines a variable to a particular region of code in which it can be used and accessed. Outside that region, this variable cannot be used or accessed. This region is called its scope. A lexical scope is usually a block of code with a set of braces around it, such as those defining the body of the subroutine or those marking the code blocks of if, while, for, foreach, and eval statements. Following is an example showing you how to define a single or multiple private variables using my operator minus Lets check the following example to distinguish between global and private variables minus When above program is executed, it produces the following result minus Temporary Values via local() The local is mostly used when the current value of a variable must be visible to called subroutines. A local just gives temporary values to global (meaning package) variables. This is known as dynamic scoping . Lexical scoping is done with my, which works more like Cs auto declarations. If more than one variable or expression is given to local, they must be placed in parentheses. This operator works by saving the current values of those variables in its argument list on a hidden stack and restoring them upon exiting the block, subroutine, or eval. Lets check the following example to distinguish between global and local variables minus When above program is executed, it produces the following result minus State Variables via state() There are another type of lexical variables, which are similar to private variables but they maintain their state and they do not get reinitialized upon multiple calls of the subroutines. These variables are defined using the state operator and available starting from Perl 5.9.4. Lets check the following example to demonstrate the use of state variables minus When above program is executed, it produces the following result minus Prior to Perl 5.10, you would have to write it like this minus Subroutine Call Context The context of a subroutine or statement is defined as the type of return value that is expected. This allows you to use a single function that returns different values based on what the user is expecting to receive. For example, the following localtime() returns a string when it is called in scalar context, but it returns a list when it is called in list context. In this example, the value of timestr is now a string made up of the current date and time, for example, Thu Nov 30 15:21:33 2000. Conversely minus Now the individual variables contain the corresponding values returned by localtime() subroutine.