डॉन तब खोल का उपयोग नहीं करते हैं।
#! /usr/bin/perl
use warnings;
use strict;
use Cwd;
use POSIX qw/ strftime /;
my $date = localtime;
my $datef = strftime "%Y%m%d%H%M.%S", localtime;
my $pwd = getcwd;
परिणाम थोड़ा अलग है: date
आदेश के उत्पादन में एक समय क्षेत्र शामिल हैं, लेकिन $date
के मूल्य से ऊपर नहीं होगा। यदि यह एक समस्या है, तो नीचे दिए गए प्रारूप को प्राप्त करने के लिए Chas. Owens द्वारा उत्कृष्ट सुझाव का पालन करें और strftime
का उपयोग करें।
आपका उप
sub touchandmail {
`touch $cache -t "$datef"`;
`echo "$msg" | mail -s "$subject" $owner -c $sendto`;
}
कुछ गलत हो जाता है, तो चुपचाप असफल हो जायेगी। मूक विफलता बुरा हैं। क्योंकि बैकटिक उत्पादन पर कब्जा करने के लिए कर रहे हैं की
sub touchandmail {
system("touch", "-t", $datef, $cache) == 0
or die "$0: touch exited " . ($? >> 8);
open my $fh, "|-", "mail", "-s", $subject, $owner, "-c", $sendto
or die "$0: could not start mail: $!";
print $fh $msg
or warn "$0: print: $!";
unless (close $fh) {
if ($! == 0) {
die "$0: mail exited " . ($? >> 8);
}
else {
die "$0: close: $!";
}
}
}
system
का उपयोग करने के बजाय बैकटिक तर्ज पर बेहतर कोड होगा आपके आशय का अधिक अर्थपूर्ण है। system(LIST)
फॉर्म खोल को छोड़ देता है और तर्कों को उद्धृत करने के बारे में चिंता करने की ज़रूरत है।
शैल पाइपलाइन echo ... | mail ...
के प्रभाव के बिना खोल का मतलब है कि हमें खुद को नलसाजी काम का थोड़ा सा काम करना है, लेकिन लाभ- system(LIST)
के साथ -इस को खोल उद्धरण के बारे में चिंता करने की आवश्यकता नहीं है। तीन या अधिक बहस के लिए
अगर मोड '|-'
है, फ़ाइल नाम एक कमांड जो करने के लिए उत्पादन पहुंचाया जा रहा है के रूप में व्याख्या की है, और अगर मोड '-|'
है, फ़ाइल नाम व्याख्या की है: कोड के ऊपर कई तर्क open
का उपयोग करता है एक आदेश के रूप में जो हमें पाइप आउटपुट।दो-तर्क (और एक-तर्क) रूप में, किसी को आदेश के साथ डैश ('-'
) को प्रतिस्थापित करना चाहिए। इसके अधिक उदाहरणों के लिए Using open
for IPC in perlipc देखें।
open
कांटे के ऊपर एक mail
प्रक्रिया, और $fh
अपने मानक इनपुट से जुड़ा है। मूल प्रक्रिया (कोड अभी भी touchandmail
चल रहा है) के साथ echo
की भूमिका निभाता है। close
क्योंकि हम इसे कैसे खोला थोड़ा अतिरिक्त कॉलिंग संभाल के आई/ओ बफ़र्स प्लस flushes:
filehandle यदि अन्य शामिल syscalls में से एक में विफल रहता है एक पाइप से open
, close
रिटर्न झूठी आया है या उसके कार्यक्रम अगर गैर-शून्य स्थिति के साथ बाहर निकलता है। यदि एकमात्र समस्या यह थी कि कार्यक्रम गैर-शून्य से निकला, $!
को 0 पर सेट किया जाएगा। पाइप बंद करने से पाइप पर निष्पादित प्रक्रिया की प्रतीक्षा भी होती है-अगर आप बाद में पाइप के आउटपुट को देखना चाहते हैं- और निहित रूप से उस आदेश के बाहर निकलने की स्थिति मान $?
और ${^CHILD_ERROR_NATIVE}
में डालता है।
use IO::All;
# for getting command output:
my @date = io("date|")->chomp->slurp;
#$date[0] contains the chomped first line of the output
या अधिक सामान्यतः:
my $fh = io("file")->chomp->tie;
while (<$fh>) {
# no need to chomp here ! $_ is pre-chomped
}
दी, date
की इस विशेष मामले मैं सहमत होगा के लिए
यह भी याद रखना उपयोगी है कि 'chomp' एक सूची ले सकता है:' chomp ($ foo, $ bar, $ fubb) '। – FMc