2013-04-02 3 views
2

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

Вот мой сценарий:

#!/usr/local/bin/perl 

use strict; 
use warnings; 
use Data::Dumper; 
use Carp qw(croak); 

my @fields; 
my ($tmp_var, $rec_type, $country, $header, $Combline, $records, $line); 
my $filename = 'data5.txt'; 

open (my $input_fh, '<', $filename) or croak "Can't open $filename: $!"; 
open my $OUTPUTA, ">", 'drp1.txt' or die $!; 
open my $OUTPUTB, ">", 'drp2.txt' or die $!; 
while (<$input_fh>) { 
    $line = _trim($_); 
    @fields = split (/\|/, $line); 
    $rec_type = $fields[0]; 
    $country = $fields[1]; 
    my $string = substr $fields[1], 0, 1; 
    $header = $line if(/^INVHDR/); 

    if ($rec_type eq 'INVDET') {          
     if ($string eq 'I') {   
      $records = $header . $line;     
      print $OUTPUTA $records, scalar <$input_fh>;    
     } 
     else {   
      $records = $header . $line; 
      print $OUTPUTB $records, scalar <$input_fh>; 
     }  
    }  
} 

close $OUTPUTA or die $!; 
close $OUTPUTB or die $!; 

sub _trim { 
    my $word = shift; 
    if ($word) {  
     $word =~ s/\s*\|/\|/g;  #remove trailing spaces 
     $word =~ s/"//g;   #remove double quotes 
    } 
    return $word; 
} 

Это часть сценария, который я хотел поставить в подпрограмме или функции:

$line = _trim($_); 
@fields = split (/\|/, $line); 
$rec_type = $fields[0]; 
$country = $fields[1]; 
my $string = substr $fields[1], 0, 1; 
$header = $line if (/^INVHDR/); 

if ($rec_type eq 'INVDET') {          
    if ($string eq 'I') {   
     $records = $header . $line;     
     print $OUTPUTA $records, scalar <$input_fh>;     
    } 
    else { 
     $records = $header . $line; 
     print $OUTPUTB $records, scalar <$input_fh>; 
    } 
}  

ответ

1

Я бы предложил разбить его несколько иначе и расширить ваши _trim функции поворота его в функцию разбора:

use strict; 
use warnings; 

open(my $input_fh, '<', 'data5.txt') or die "Can't open $filename: $!"; 
open(my $OUTPUTA, '>', 'drp1.txt') or die $!; 
open(my $OUTPUTB, '>', 'drp2.txt') or die $!; 

my $header = ''; 
while (<$input_fh>) { 
    if ($_ =~ /^INVHDR/) { 
     $header = $_; 
    } 
    if ($_ =~ /^INVDET/) { 
     my @data = parse($_); 
     my $line = $header . join('|', @data); 
     # scalar <$input_fh> is almost certainly not doing what you expect, 
     # though I'm not sure what you're try to accomplish with it 
     if ($data[1] =~ /^I/) { 
      print $OUTPUTA $line; 
     } else { 
      print $OUTPUTB $line; 
     } 
    } 
} 

sub parse { 
    my $input = shift || return; 
    my $input =~ s/"//g; # remove double quotes 
    # Here I've combined the removal of trailing spaces with the split. 
    my @fields = split(m{\s*\|}, $input); 
    return @fields; 
} 
+0

спасибо! Я сразу это сделаю благодарю вас за помощь – Soncire

-1

написать простой запрос на выборку в rooutine он будет дайте результат в качестве возврата, когда вы вызываете эту подпрограмму .... , но если ур в PLSQL, то вы должны использовать curs0r

попробуйте вот так

Mysql Sub рутина:

create procedure get_data(in param1 date) 
    begin 
    select * from mytable where mydate=param1; 
    end; 

Java:

 CallableStatement cstmt = MyConnection.prepareCall("{call mydb.get_data(?)}"); 
     cstmt.setString(1, '2012-01-01'); 
     ResultSet rs = cstmt.executeQuery(); 
     int nF = rs.getMetaData().getColumnCount(); 
     rs.last(); 
     String[][] out = new String[rs.getRow()][nF]; 

     for (int i=0; i<nF; i++) { 
     rs.beforeFirst(); 
     int n=0; 
     while (rs.next()) { 
     out[n][i]=rs.getString(i+1); 
     n++; 
     } 
     } 

      cstmt.close(); 
      return out; 

Держите visting http://zeeshanakhter.com & http://latest-tutorial.com

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