با سلام خدمت کاربران گرامی سایت پی وی لرن و کاربرانی که علاقمندان به دوره آموزشی پرل Perl. در جلسه گذشته با فرمت و کار با آن ها آشنا شدیم. در این جلسه یعنی ۱۶ جلسه از سلسله جلسات آموزش پرل، با آموزش مدیریت فایل ها در پرل همراه شما خواهیم بود.
آموزش مدیریت فایل ها در پرل سعی می کند که شما را با اصول این کار آشنا نماید.
اصول مدیریت فایل ها در پرل بسیار ساده است :
برای این کار باید filehandle را با یک مورد خارجی ( معمولاً یک فایل ) مرتبط سازید و سپس از چندین اپراتور و تابع موجود در پرل برای خواندن و به روز رسانی اطلاعات ذخیره شده در جریان داده ها مرتبط با filehandle استفاده نمایید.
یک filehandle یک named internal Perl است که فایل فیزیکی را به اسم آن متصل می کند.
همه filehandle قادر به خواندن و نوشتن دسترسی ها هستند. بنابرین می توان هر فایل یا دستگاه مرتبط با یک filehandle را خواند و به روز رسانی کرد.
با این حال وقتی یک filehandle را متصل می سازید؛ می توانید مشخص کنید که حالت باز شدن آن چگونه باشد.
سه نوع filehandle پایه وجود دارد.
STDIN, STDOUT و STDERR که به ترتیب نشان دهنده ورودی استاندارد، خروجی استاندارد و دستگاه های خطای استاندارد هستند.
در ادامه به نحوه باز کردن و بستن فایل ها در آموزش مدیریت فایل ها در پرل می پردازیم.
به طور کل دو نوع تابع با فرم های متفاوت برای باز کردن هر فایل جدید در پرل وجود دارد.
1 2 3 4 5 | open FILEHANDLE, EXPR open FILEHANDLE sysopen FILEHANDLE, FILENAME, MODE, PERMS sysopen FILEHANDLE, FILENAME, MODE |
FILEHANDLE در کد بالا file handle است که توسط تابع open بازگردانی شده است و EXPR عباراتی است که نام فایل و حالت بازگشایی فایل را دارد.
در ادامه سینتکسی که از آن برای باز کردن file.txt در حالت read-only mode استفاده می شود را می بینید.
در این جا کمتر از علامت > که از آن برای باز کردن فایل در حالت read-only استفاده می شود؛ استفاده شده است.
1 | open(DATA, "<file.txt"); |
DATA در مثال بالا file handle ماست که از آن برای خواندن فایل استفاده می کنند.
در ادامه مثالی آورده شده که در آن یک فایل و محتوای در صفحه باز شده و پرینت شده است.
1 2 3 4 5 6 7 | #!/usr/bin/perl open(DATA, "<file.txt") or die "Couldn't open file file.txt, $!"; while(<DATA>) { print "$_"; } |
در ادامه سینتکسی که از آن برای باز کردن file.txt در حالت writing mode استفاده می شود را می بینید.
در این جا کمتر از علامت < که از آن برای باز کردن فایل در حالت writing mode استفاده می شود؛ استفاده شده است.
1 | open(DATA, ">file.txt") or die "Couldn't open file file.txt, $!"; |
این مثال فایل را قبل از باز کردن و نوشتن در آن اقدام به کوتاه سازی (پاک سازی) می کند که ممکن است اثر دلخواه شما نباشد.
اگر می خواهید فایلی را برای خواندن و نوشتن باز کنید می توانید یک علامت + قبل از کاراکتر > or < بگذارید.
برای باز کردن یک فایل به منظور به روز رسانی آن بدون کوتاه سازی آن، می توانید از مثال زیر استفاده نمایید.
1 | open(DATA, "+<file.txt"); or die "Couldn't open file file.txt, $!"; |
برای کوتاه سازی فایل از نمونه زیر استفاده نمایید.
1 | open DATA, "+>file.txt" or die "Couldn't open file file.txt, $!"; |
می توان یک فایل را در حالت الحاق append mode نیز باز کرد.
در این حالت writing point باید برای پایان دادن به فایل تنظیم شود.
1 | open(DATA,">>file.txt") || die "Couldn't open file file.txt, $!"; |
یک << دوبله فایل را برای الحاق باز می کند و file pointer را در انتها جایگذاری می نماید؛ بنابرین می توان فوراً الحاق اطلاعات را آغاز نمود.
با انجام این کار گرچه دیگر نمی توانید فایل را بخوانید اما قرار دادن یک علامت + در مقابل آن این مشکل را حل می نماید.
1 | open(DATA,"+>>file.txt") || die "Couldn't open file file.txt, $!"; |
در ادامه می توانید مقادیر حالت های متفاوت ممکن را ببینید.
تابع Sysopen تا حد زیادی شبیه به تابع open است.
این تابع از سیستم تابع open و پارامترهای ارائه شده به آن به عنوان پارامترهای عملکرد سیستم استفاده می نماید.
برای مثال می توانید برای به روز رسانی یک فایل از فرمت باز filename>+ استفاده نمایید.
1 | sysopen(DATA, "file.txt", O_RDWR); |
اگر قصد کوتاه سازی فایل قبل ار به روز رسانی آن را دارید از نمونه زیر استفاده نمایید.
1 | sysopen(DATA, "file.txt", O_RDWR|O_TRUNC ); |
می توانید از :
O_CREAT برای ساخت یک فایل جدید
-O_WRONLY برای باز کردن فایل در write only mode
و O_RDONLY برای باز کردن فایل در read only mode
استفاده نمایید.
PERMS argument مجوز های فایل را برای file specified مشخص می نماید.
اگر این بخش باید ساخته شود در این صورت به صورت پیش فرض مقدار آن ۰x666 است.
در ادامه آموزش کار مدیریت فایل ها در پرل مقادیر ممکن MODE را به شما معرفی می نماییم.
در ادامه آموزش مدیریت فایل ها در پرل شما را با تابع Close در پرل آشنا می نماییم.
برای بستن یک filehandle و جدا کردن آن از corresponding file باید از تابع close استفاده نمایید.
این امر موجب می شود که filehandle’s buffers خالی شود و سیستم فایل descriptor را می بندد.
1 2 | close FILEHANDLE close |
اگر هیچ FILEHANDLE تعیین نشده باشد در آن صورت filehandle انتخاب شده فعلی بسته خواهد شد.
اگر buffers ها با موفقیت خالی شوند و فایل بسته شود در آن صورت true only بازگردانی می شود.
1 | close(DATA) || die "Couldn't close file properly"; |
برای باز کردن filehandle ابتدا باید قادر باشید که اطلاعات را بخوانید و بنویسید.
روش های زیادی برای نوشتن و خواندن داده ها در درون فایل ها وجود دارد.
اپراتور <FILEHANDLE> روش اصلی برای خواندن اطلاعات از یک filehandle باز است.
در اسکالر context، این روش موجب بازگردانی یک خط از filehandle می شود.
به مثال زیر توجه نمایید.
1 2 3 4 5 | #!/usr/bin/perl print "What is your name?\n"; $name = <STDIN>; print "Hello $name\n"; |
وقتی از اپراتور <FILEHANDLE> در لیست context استفاده می نمایید، یک لیست از خطوط مشخص filehandle بازگردانی می شوند.
در مثال زیر می توانید ببینید که چطور همه خطوط فایل را درون یک array وارد شده اند.
1 2 3 4 5 | #!/usr/bin/perl open(DATA,"<import.txt") or die "Can't open data"; @lines = <DATA>; close(DATA); |
تابع getc یک کاراکتر را از FILEHANDLE مشخص شده یا STDIN بازگردانی می نماید.
1 2 | getc FILEHANDLE getc |
اگر یک خطا وجود داشته باشد، یا filehandle در پایان فایل باشد، در آن صورت undef به جای آن بازگردانده خواهد شد.
تابع read دیگر تابعی است که در آموزش مدیریت فایل ها در پرل به آن می پردازیم.
تابع read یک بلوک از اطلاعات را از buffered filehandle می خواند.
از این تابع برای خواندن داده های باینری از فایل استفاده می شود.
1 2 | read FILEHANDLE, SCALAR, LENGTH, OFFSET read FILEHANDLE, SCALAR, LENGTH |
طول داده read توسط LENGTH تعریف شده است، و در صورت عدم OFFSET، داده ها در ابتدای SCALAR قرار می گیرند. در غیر این صورت داده ها بعد از بایت های OFFSET در SCALAR قرار خواهند گرفت.
این تابع تعدادی از بایت هایی که با موفقیت خوانده شده اند را بازگردانی می نماید.
اگر خطایی وجود داشته باشد در آن صورت یک صفر یا undef در پایان فایل قرار می گیرد.
برای تمام روش های مختلفی که برای خواندن اطلاعات از filehandles، تابع اصلی برای نوشتن اطلاعات، تابع print است.
1 2 3 | print FILEHANDLE LIST print LIST print |
تابع print مقادیر ارزیابی شده از LIST to FILEHANDLE یا مقدار خروجی filehandle را پرینت می نماید. (STDOUT by default).
به مثال زیر توجه نمایید.
1 | print "Hello World!\n"; |
در ادامه آموزش مدیریت فایل ها در پرل شما را با کپی سازی فایل ها در این زبان آشنا می نماییم.
در زیر می توانید نمونه ای را ببینید که فایل file1.txt را باز می کند و خط آن را به صورت خطی می خواند و فایل file2.txt دیگری را تولید می نماید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #!/usr/bin/perl # Open file to read open(DATA1, "<file1.txt"); # Open new file to write open(DATA2, ">file2.txt"); # Copy data from one file to another. while(<DATA1>) { print DATA2 $_; } close( DATA1 ); close( DATA2 ); |
در مثال زیر می توانید ببینید که چگونه می توان فایل file1.txt را به فایلfile2.txt تغییر نام داد.
فرض می کنیم که این فایل در دایرکتوری in /usr/test وجود دارد.
1 2 3 | #!/usr/bin/perl rename ("/usr/test/file1.txt", "/usr/test/file2.txt" ); |
این تابع تغییر نام دو argument را انجام می دهد و فقط فایل موجود را تغییر می دهد.
در تابع زیر می توانید ببینید که چگونه فایل file1.txt را با استفاده از تابع unlink حذف کنید.
1 2 3 | #!/usr/bin/perl unlink ("/usr/test/file1.txt"); |
می توانید از تابع tell استفاده نمایید تا موقعیت فعلی یک فایل را بیابید و از تابع seek استفاده نمایید تا به یک موقعیت خاص در تابع اشاره نمایید.
اولین قدم برای یافتن موقعیت تان در فایل استفاده از تابع tell است.
1 2 | tell FILEHANDLE tell |
این تابع موقعیت اشاره گر فایل را در بیت ها با استفاده از FILEHANDLE مشخص می کند و یا filehandle انتخابی پیش فرض فعلی را اگر از قبل مشخص نشده باشد تعیین می نماید.
تابع seek موقعیت اشاره گر فایل را تعیین می کند تا تعدادی از بایت ها در فایل تعیین نماید.
1 | seek FILEHANDLE, POSITION, WHENCE |
این تابع از عملکرد سیستم fseek استفاده می کند و می توان سه موقعیت متفاوت را در آن تعیین کرد: شروع، پایان، و موقعیت فعلی.
می توان این کار را به وسیله WHENCE انجام داد.
صفر موقعیت مرتبط با ابتدای فایل را تنظیم می نماید.
برای مثال خط اشاره گر فایل را به بایت ۲۵۶ در فایل قرار می دهد.
1 | seek DATA, 256, 0; |
با استفاده از یک سری از اپراتورهای تست که به طور کلی به عنوان تست -X شناخته می شوند می توانید ویژگی های خاصی را به سرعت در پرل تست نمایید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #/usr/bin/perl my $file = "/usr/test/file1.txt"; my (@description, $size); if (-e $file) { push @description, 'binary' if (-B _); push @description, 'a socket' if (-S _); push @description, 'a text file' if (-T _); push @description, 'a block special file' if (-b _); push @description, 'a character special file' if (-c _); push @description, 'a directory' if (-d _); push @description, 'executable' if (-x _); push @description, (($size = -s _)) ? "$size bytes" : 'empty'; print "$file is ", join(', ',@description),"\n"; } |
در این جلسه آموزش مدیریت فایل ها در پرل را به شما ارائه نمودیم.
در جلسه بعدی به آموزش دایرکتوری ها خواهیم پرداخت.
با پی وی لرن همراه باشید.
کوشا یگانه
با تشکر از آموزش دقیق و مفید پرل.در توضیحات فایل ها، ورودی
استاندار و خروجی استاندارد اشتباه ذکر شده است.