GNU/Linux >> Belajar Linux >  >> Linux

6 Contoh Fungsi Evaluasi Perl – Regex, Penanganan Kesalahan, Memerlukan, Timeout, Kode Dinamis

Fungsi bawaan Perl eval sangat kuat. Pada artikel ini mari kita ulas bagaimana menggunakan regex di eval, menjebak error menggunakan eval, membuat kode dinamis menggunakan eval, menyisipkan kode dari file/sub-rutin menggunakan eval dll,

Bentuk umum perl eval mengharapkan ekspresi atau blok kode sebagai argumen.

1. Perbedaan Antara Berbagai Pernyataan Evaluasi Perl

Mari kita perhatikan cuplikan kode perl berikut:

$expr =‘$a + $b';
eval $expr; #1
eval “$expr”; #2
eval ‘$expr’; # 3
eval { $expr }; # 4

Kasus # 1 dan # 2 identik di mana Perl mengidentifikasi mereka sebagai pernyataan yang dapat dieksekusi yang valid dan mengevaluasi ekspresi. Jadi, itu akan menghasilkan hasil sebagai "30".

Dalam kasus # 3, ekspresi tidak dapat diperluas. Jadi, ini memberikan ekspresi aktual ($a + $b) sebagai hasilnya. Ini tidak akan umum digunakan oleh siapa pun.

Kasus #4 identik dengan kasus #3, tetapi pernyataan di dalam blok divalidasi untuk kesalahan sintaksis pada waktu kompilasi.

2. Penanganan Ekspresi Reguler dengan Eval

Dengan penggunaan eval, kita dapat mengurangi jumlah baris dalam kode secara signifikan ketika perlu mencocokkan baris untuk lebih dari sejumlah ekspresi reguler.

Daftar ekspresi reguler dapat dimasukkan ke dalam wadah (hash / array), dan dalam satu lingkaran ekspresi reguler dapat diambil satu per satu dan cocok dengan baris input seperti yang ditunjukkan di bawah ini.

$line = <>;
%hash = (
number     => qr/^[0-9]+$/,
alphabets   => qr/^[a-zA-Z]+$/
);

while( my ($key,$value) = each(%hash) ) {
if(eval    "$line =~ /$value/") {
print "$key\n";
}
}

3. Penanganan Kesalahan Evaluasi Perl – Kesalahan Menjebak

Eval digunakan untuk menjebak kesalahan. Selama eksekusi subrutin, program mungkin mati karena kesalahan, atau pemanggilan eksternal fungsi mati. Selama waktu ini, jika blok kode perl dieksekusi di dalam eval, maka program akan terus berjalan bahkan setelah die atau error, dan juga menangkap error atau kata mati.

Kesalahan Pembagi Nol:

eval  { $average =  $total / $count };
print “Error captured : $@\n”;

Di atas, $count berisi nilai sebagai 0. Ketika kita menjalankan kode tanpa blok eval, program akan keluar.

Lari Setelah Mati

sub func
{
die “dieing in subroutine func\n”;
}
eval { func(); };
print “Error captured : $@\n”;

Perl eval tidak dapat menangkap kesalahan berikut:

  • Sinyal tidak tertangkap
  • Memori habis
  • Kesalahan sintaks

4. Kode Perl Dinamis Menggunakan Eval

Eval dapat mengkompilasi dan mengeksekusi kode dari string saat runtime. Jadi, kita dapat menulis program perl dinamis menggunakan eval.

print “Enter number 1 : ”;
$data1 = ;
print “Enter number 2 : ”;
$data2 = ;
print “Enter operator : ”;
$operator = ;
$str = “$data1 $operator $data2”;
$result = eval “$data1 $operator $data2”;

Kami dapat mengeksekusi sejumlah pernyataan di eval. Hasil dari eval adalah ekspresi terakhir yang dievaluasi.

Kita harus berhati-hati dalam menggunakan eval pada sebuah string, karena dapat mengeksekusi data yang tidak dipercaya dari sebuah string. Jika operasi penugasan harus dilakukan dalam string itu sendiri, kita harus berhati-hati dalam menangani nilai.

$str = “\$result = $data1 $operator $data2”;
eval { $str };

5. Memasukkan Skrip Perl Dari File atau Subrutin Selama Waktu Proses

Di Perl, kita dapat memuat modul secara dinamis saat dijalankan. Untuk memuat modul secara dinamis, kita harus menggunakan "memerlukan" ( bukan "menggunakan").
Contoh kode untuk memuat modul ketika file input adalah file terkompresi,

$filetype = `file $InputFile`;

if($filetype =~ /gzip compressed/) {
print  "compressed input file...\n";
eval { require PerlIO::gzip; };
}

Subrutin umum yang digunakan dalam program dapat dipisahkan menjadi file yang dapat dimuat ke dalam program perl dengan eval seperti yang ditunjukkan di bawah ini.

File :  common_routines.pl
sub open_file
{
....
}
sub read_file
{
....
}
sub write_file
{
....
}
sub close_file
{
....
}
In the perl script,
sub load_file_subroutines
{
open CODE, 'common_routines.pl';
undef $\;
my $code = <code>;
close CODE;
eval $code;
die $@ if $@;
}</code>

6. Perl Eval di Input Time-Out

Fungsi perpustakaan standar alarm digunakan untuk menghasilkan sinyal SIGALRM setelah waktu tertentu. Ini terutama akan membantu kami menghindari pemblokiran menunggu pada input pengguna. Ini dapat digunakan dengan eval untuk mendapatkan input pengguna dalam waktu tertentu seperti yang ditunjukkan pada contoh di bawah ini.

$SIG{ALRM} = \&input_timed_out;
eval {
alarm (10);
$buf = <>;
alarm(0);           # Cancel the pending alarm if user responds.
};
if ($@ =~ /NO USER INPUT IN TIME/) {
print "Timed out.\n";
}
sub input_timed_out {
die "NO USER INPUT IN TIME";
}

Linux
  1. Penanganan kesalahan dalam skrip Bash

  2. Pelajari penanganan kesalahan Bash dengan contoh

  3. Panggil ke fungsi yang tidak ditentukan simplexml_load_file() – Kesalahan PHP [Terpecahkan]

  1. Tidak dapat menemukan Test/Harness.pm perl Error:[Solution]

  2. Kesalahan Perl:Modul PERL XML-Parser memerlukan pengembangan expat

  3. Modul PERL DB_File membutuhkan db4-devel [Fix]

  1. Cara Memanggil Fungsi C di C++, Fungsi C++ di C (Campuran C dan C++)

  2. Apa :-!! dalam kode C?

  3. Bagaimana fungsi eval dapat digunakan di makefile?