как отобразить значение хеша из моих данных образца - PullRequest
1 голос
/ 08 октября 2019

В данный момент я изучаю Perl, я хотел попросить помощи, чтобы ответить на это упражнение. Моя цель состоит в том, чтобы отобразить значение хеша PartID 1,2,3, в примере которого выводятся значения лота, пластины, программы, версии, имен тестов, номеров тестов, значений hilimit, lolimit и partid.

пример данных

lot=lot123
wafer=1
program=prgtest
version=1
Testnames,T1,T2,T3
Testnumbers,1,2,3
Hilimit,5,6,7
Lolimit,1,2,3
PartID,,,,
1,3,0,5
2,4,3,2
3,5,6,3

Это мой код:

#!/usr/bin/perl
use strict;
use Getopt::Long;

my $file = "";

GetOptions ("infile=s" => \$file ) or die("Error in command line arguments\n");
my $lotid = "";

open(DATA, $file) or die "Couldn't open file $file";

while(my $line = <DATA>) {
#print "$line";
              if ( $line =~ /^lot=/ ) {
                             #print "$line \n";
                             my ($dump, $lotid) = split /=/, $line;
                             print "$lotid\n";
              }

              elsif ($line =~ /^program=/ ) {
                            my ($dump, $progid) = split /=/, $line;
                            print "$progid \n";  
              }

              elsif ($line =~ /^wafer=/ ) {
                            my ($dump, $waferid) = split /=/, $line;
                            print "$waferid \n";  
              }

              elsif ($line =~ /^version=/ ) {
                            my ($dump, $verid) = split /=/, $line;
                            print "$verid \n";  
              }
              elsif ($line =~ /^testnames/i) {

                             my ($dump, @arr) = split /\,/, $line;

                             foreach my $e (@arr) {
                                           print $e, "\n";
                             }
              }
                elsif ($line =~ /^testnumbers/i) {

                             my ($dump, @arr1) = split /\,/, $line;

                             foreach my $e1 (@arr1) {
                                           print $e1, "\n";
                             }
              }
                elsif ($line =~ /^hilimit/i) {

                             my ($dump, @arr2) = split /\,/, $line;

                             foreach my $e2 (@arr2) {
                                           print $e2, "\n";
                             }
              }
                elsif ($line =~ /^lolimit/i) {

                             my ($dump, @arr3) = split /\,/, $line;

                             foreach my $e3 (@arr3) {
                                           print $e3, "\n";
                             }
              }

}

Пожалуйста, помогите добавить мой код вдисплей Partid 1,2,3 хеш.

1 Ответ

1 голос
/ 08 октября 2019

Так что я немного переписал ваш код, чтобы использовать несколько более современных идиом Perl (вместе с некоторыми комментариями, чтобы объяснить, что я сделал). Бит, который я добавил, находится около дна.

#!/usr/bin/perl

use strict;
# Added 'warnings' which you should always use
use warnings;
# Use say() instead of print()
use feature 'say';

use Getopt::Long;

my $file = "";

GetOptions ("infile=s" => \$file)
  or die ("Error in command line arguments\n");

# Use a lexical variable for a filehandle.
# Use the (safer) 3-argument version of open().
# Add $! to the error message.
open(my $fh, '<', $file) or die "Couldn't open file $file: $!";

# Read each record into $_ - which makes the following code simpler
while (<$fh>) {
  # Match on $_
  if ( /^lot=/ ) {
    # Use "undef" instead of a $dump variable.
    # split() works on $_ by default.
    my (undef, $lotid) = split /=/;
    # Use say() instead of print() - less punctuation :-)
    say $lotid;
  }

  elsif ( /^program=/ ) {
    my (undef, $progid) = split /=/;
    say $progid;  
  }

  elsif ( /^wafer=/ ) {
    my (undef, $waferid) = split /=/;
    say $waferid;  
  }

  elsif ( /^version=/ ) {
    my (undef, $verid) = split /=/;
    say $verid;  
  }

  elsif ( /^testnames/i) {
    my (undef, @arr) = split /\,/;

    # Changed all of these similar pieces of code
    # to use the same variable names. As they are
    # defined in different code blocks, they are 
    # completely separate variables.
    foreach my $e (@arr) {
      say $e;
    }
  }

  elsif ( /^testnumbers/i) {
    my (undef, @arr) = split /\,/;

    foreach my $e (@arr) {
      say $e;
    }
  }

  elsif ( /^hilimit/i) {
    my (undef, @arr) = split /\,/;

    foreach my $e (@arr) {
      say $e;
    }
  }

  elsif ( /^lolimit/i) {
    my (undef, @arr) = split /\,/;

    foreach my $e (@arr) {
      say $e;
    }
  }

  # And here's the new bit.
  # If we're on the "partid" line, then read the next
  # three lines, split each one and print the first
  # element from the list returned by split().
  elsif ( /^partid/i) {
    say +(split /,/, <$fh>)[0] for 1 .. 3;
  }
}

Обновление: Кстати, в этом коде нет ни одного хэша: -)

Обновление 2: Я только что понял, что у вас есть только три разных способа обработки данных. Таким образом, вы можете значительно упростить свой код, используя несколько более сложные регулярные выражения.

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Getopt::Long;

my $file = "";

GetOptions ("infile=s" => \$file)
  or die ("Error in command line arguments\n");

open(my $fh, '<', $file) or die "Couldn't open file $file: $!";

while (<$fh>) {
  # Single value - just print it.
  if ( /^(?:lot|program|wafer|version)=/ ) {
    my (undef, $value) = split /=/;
    say $value;
  }

  # List of values - split and print.
  elsif ( /^(?:testnames|testnumbers|hilimit|lolimit)/i) {
    my (undef, @arr) = split /\,/;

    foreach my $e (@arr) {
      say $e;
    }
  }

  # Extract values from following lines.
  elsif ( /^partid/i) {
    say +(split /,/, <$fh>)[0] for 1 .. 3;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...