作者 主題: 問一個perl 很基本的檔案處理問題  (閱讀 12878 次)

0 會員 與 1 訪客 正在閱讀本文。

evan30

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
問一個perl 很基本的檔案處理問題
« 於: 2011-01-15 18:38 »
小弟剛學 perl ,對檔案的處理,還是一頭霧水…
如果要open A檔案,替換其中一個字串,然後存成檔案B,標準的寫法是什麼??

這樣嗎???

open(A, "<filename");
open(B, ">filename");

s/xxx/yyy/ ;   

close(A);
close(B);


evan30

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #1 於: 2011-01-15 21:36 »
我來自問自答…  只是對用 join 還是有點不懂…  (我試過不用 join,結果$Fi 就只有第一行)

open(A, "<filename");
open(B, ">filename");

my $Fi = join '',<A>;
$Fi =~ s!FILENAME!$Filename! ;
print B $Fi;   

close(A);
close(B);


hongbin

  • 憂鬱的高中生
  • ***
  • 文章數: 101
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #2 於: 2011-01-16 16:03 »
Perl 是透過File handle 的方式來對檔案進行存取...
假設欲獨取的檔案為fileA.txt;
      欲寫入得檔案為FileB.txt;

open(A,"fileA.txt")||die "Cant' open File fileA.txt";
open(B,">fileB.txt")||die "Can't open File fileB.txt";
while(<A>)
{
   $_=~ s/欲比對的字串/欲取代的字串/g;
   print B $_;
}
close(A);
close(B);

您可能要多閱讀一些有關Perl 的文章
介紹您幾個網址..
http://perl.hcchien.org/ch10.html
http://mirror.sars.tw/Perl_intro/book1.html
« 上次編輯: 2011-01-16 17:46 由 hongbin »

喵喵咩咩

  • 可愛的小學生
  • *
  • 文章數: 13
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #3 於: 2011-02-10 17:04 »
如果趕時間且只是單純的文字檔, 可以利用 shell 的 '>' 和 perl 的 'print' 就可以做到您要的功能
例如說你寫的 perl (假設檔名叫 perl_copy_A) 只是把 A 檔的內容全 print 出來
在關鍵的那行對 print 做修改後繼續 print

只要下這個指令
    $perl perl_copy_A > B
就完成囉
« 上次編輯: 2011-02-10 17:05 由 farkeu »

evan30

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #4 於: 2011-03-27 09:35 »
那如果讀取寫入的是同一個檔案,可以嗎?

open(A,"fileA.txt");
while(<A>)
{
   $_=~ s/欲比對的字串/欲取代的字串/g;
   print A $_;
}
close(A);





Perl 是透過File handle 的方式來對檔案進行存取...
假設欲獨取的檔案為fileA.txt;
      欲寫入得檔案為FileB.txt;

open(A,"fileA.txt")||die "Cant' open File fileA.txt";
open(B,">fileB.txt")||die "Can't open File fileB.txt";
while(<A>)
{
   $_=~ s/欲比對的字串/欲取代的字串/g;
   print B $_;
}
close(A);
close(B);

您可能要多閱讀一些有關Perl 的文章
介紹您幾個網址..
http://perl.hcchien.org/ch10.html
http://mirror.sars.tw/Perl_intro/book1.html


KT

  • 可愛的小學生
  • *
  • 文章數: 15
    • 檢視個人資料
    • 我愛墾丁
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #5 於: 2011-03-28 00:05 »
讀、寫同一個檔案,那就讀、寫各開一次檔案吧:
代碼: [選擇]
open FILE, "<file.txt" or die "open file ERROR!";
my @temp = <FILE>;
close (FILE);
open FILE, ">file.txt" or die "open file ERROR!";
foreach my $data (@temp) {
$data =~ s/欲比對的字串/欲取代的字串/g;
print FILE $data ;
}
close (FILE);
   
不過這有個風險,第二次 open 之後,尚未 close 之前 (也就是仍在執行 foreach 時),若遇到停電,file.txt 會被消空。

我看 perldoc > Language reference > Functions > open 這樣寫:
引用
You can put a '+' in front of the '>' or '<' to indicate that you want both read and write access to the file; thus '+<' is almost always preferred for read/write updates--the '+>' mode would clobber the file first. You can't usually use either read-write mode for updating textfiles, since they have variable length records. See the -i switch in perlrun for a better approach. The file is created with permissions of 0666 modified by the process's umask value.
以乎是開檔 MODE 多一個 '+' 就可以只 open 一次,但可能要配合 seek 等指令。我沒試過這樣做,若你有試出來,再分享一下。

hongbin

  • 憂鬱的高中生
  • ***
  • 文章數: 101
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #6 於: 2011-03-28 14:42 »
提供一個方式:
假設 perl script 的檔為test.pl,內容如下:

#!/usr/bin/perl

$^I="";
while(<>){
        s/欲比對的字串/欲取代的字串/g;
        print;
}







然後執行  chmod +x test.pl;

./test.pl  fileA
即可將 fileA 的內容進行修改
« 上次編輯: 2011-03-28 14:46 由 hongbin »

evan30

  • 可愛的小學生
  • *
  • 文章數: 21
    • 檢視個人資料
回覆: 問一個perl 很基本的檔案處理問題
« 回覆 #7 於: 2011-04-16 18:39 »
請問 hongbin

$^I="";  這方式,如果不是用 ./test.pl  fileA  這種方式,去帶入 fileA
有可能在程式裡去打開更改 fileA 嗎? 我試了好多次,好像都不行…