2010-03-18 55 views
1

我需要了解這個特殊程序的工作,這似乎是相當複雜的,請你看,如果你能幫助我理解這是什麼程序在Perl呢,我是初學者,所以我幾乎無法理解在下面的鏈接給出的代碼中發生了什麼,任何類型的指導或見解這個程序是高度讚賞。謝謝... :) 這個計劃被稱爲premove.pl.cPerl程序 - 動態啓動代碼

多一個程序premove.pl有關它, 其代碼如下所示:

#!perl 

open (newdata,">newdata.txt") 
|| die("cant create new file\n");#create passwd file 
$linedata = ""; 
while($line=<>){ 
chomp($line); 
#chop($line); 
print newdata $line."\n"; 
} 
close(newdata); 
close(olddata); 

__END__ 

我甚至不知道如何運行這裏提到兩個程序。我也想知道第一個程序的擴展是什麼意思,因爲它有「pl.c」的擴展名,請告訴我,如果你知道它可能意味着什麼。我需要儘快瞭解它,爲什麼我要發佈這個問題,我還有一些其他的時間,我會盡力弄清楚自己,這對於像我這樣的初學者來說似乎是一個複雜的程序,希望你能理解。再次感謝您的時間。

回答

4

首先,關於您發佈的Perl代碼:

參見:

這是一些殘暴惡意代碼。我爲你重寫了它,沒有任何混淆和愚蠢。這應該更容易理解。

#!perl 
use strict; 
use warnings; 
use IO::File; 

my $newdata = IO::File->new('newdata.txt', '>') 
    or die "Unable to open newdata - $!\n"; 

while(my $line = <>) { 

    $newdata->print($line); 

} 

可能造成混淆的主要原因是<>或空文件句柄讀取。在這裏它從程序參數中列出的任何文件中抓取一行,或者如果沒有提供參數,它會讀取STDIN。

這個劇本基本上是cat filename > newdata.txt

至於premove.pl.c,我不是專家內部,但它看起來像筆者以瞭解如何嵌入在C程序Perl解釋器的例子並粘貼它變成一個奇怪的命名文件。
它看起來像它會編譯成相當於perl的東西。總之,另一個無用的神器。生產這種產品的人是否由生產線支付?

如果這是你繼承了代碼的狀態,我爲你感到難過。

+0

嗨.. :)謝謝你的回答。代碼premove.pl,是不是隻是從任何文本中刪除新的行字符(如'\ r'),並附加新生成的文本,即新數據與'\ n'?在您修改程序的版本中,我看不到任何使用的「chomp」關鍵字,您是否刪除了它?它看起來像是用原來的文件中的'\ n'替代了新的行字符(比如說早些時候它是'\ r')並將其附加到newdata.txt中。我對我發佈的計劃的解釋是否正確? – boddhisattva 2010-03-19 10:59:06

+0

@mgj,我刪除了'chomp',因爲它是多餘的。'chomp'在一個字符串的末尾刪除一個出現的全局'$ /'(如果你使用英文''也就是'$ INPUT_RECORD_SEPARATOR'),默認爲'\ n'。由於原始代碼扼殺了行,然後在末尾連接了一個'\ n'並打印出來,所以它沒有做任何事情。請注意,我不打印'$ line' - 我不刪除'\ n',所以我不必將其添加回去。 'chomp'對'\ r'字符沒有影響,除非'$ /'設置爲'\ r'。 – daotoad 2010-03-19 17:25:24

+0

K .. :)感謝您的回答daotoad,它看起來像代碼沒有做任何事情,但如果我給在該字符串的末尾有\ r的ip文件,那麼它就是這樣的情況,它chmops \ r並代之以\ n的權利,那麼我認爲chomp不再是多餘的......正確的......? – boddhisattva 2010-03-20 02:30:31

1

它看起來像有人試圖在你的程序上運行一個Perl-to-C轉換器,以便它們可以將它編譯爲一個C對象。他們可能認爲這會讓它變得更快。我猜你可以忽略.c文件並直接使用該Perl腳本。

+0

謝謝你的回答先生,也爲你的時間.. :) – boddhisattva 2010-03-25 02:51:09