Perl一括で著作権情報を追加する
すべての入力ファイルに著作権情報がない場合は追加し、そうでない場合は何もせず、元のファイルを .bak の末尾でバックアップします。
まず始めに、私は以下の手順で行っています(試す前に必ず入力ファイルをバックアップしてください)。
#!usr/bin/perl -w
$^I = ".bak";
my %do_these;
foreach (@ARGV){
print $_;
$do_these{$_} = 1;
}
while(<>){
if(/^## Copyright/){
delete $do_these{$ARGV};
}
}
@ARGV = sort keys %do_these;
while(<>){
if(/^#! /){
$_ . = "## Copyright (C) 2011 by yujianjun";
}
print;
}
結果 オリジナルファイルもバックアップファイルも全て空白、最悪です。(今後、プログラムをテストするときは、バックアップを取ることを忘れないでください)。
原因を分析する。
主な原因は、$^Iの使い方が間違っていることです。まず、$^Iの仕組みから見ていきましょう。
Iのデフォルト値はundefで、プログラムには影響しません。これが文字列に割り当てられると(プログラムでは ".bak" など)、プログラムはバックアップ処理を行い、その文字列をバックアップファイル名の拡張子として元のファイル名に追加します。ファイルを開くためにdiamond演算子を使用する場合、perlの操作は、まず開いたファイルの名前を拡張名を加えたファイル名に変更し、次に元のファイル名で新しいファイルを作成し、プログラムがファイルの内容を一行ずつ読み込んで何らかの変更を加えた後、新しいファイルに保存することになります。これは、ファイルの内容を変更し、古いファイルをバックアップすることと同じです。もちろん、この値がundefであれば、古いファイルはバックアップされません。
上記のプログラムでは、先頭に $^I = ".bak"; を置いていますが、その後に2つのファイル読み込み操作が続くので、この2つの操作の違いを説明します。読み込んだファイルがfile.plで、最初のwhile(<>)で元のファイルをfile.pl.bakにしたとします。すると、file.pl という名前の新しい空のファイルが作成されます。しかし、新しいファイルはプログラムの最後にしかディスクに書き込まれないので、次の2番目の読み込みファイル操作 while(<>) で、空の file.pl を file.pl.bak に変えて、最初のバックアップファイルを上書きし、新しい空のファイル file.pl を作成して、その時点で元のファイルとバックアップファイルの両方の内容が空になっていることにします。
Iの仕組みを理解すれば、このプログラムは簡単に修正することができます。
以下のように、最後のファイル読み込み操作while(<>)の前に $^I = ".bak"; を置くだけです。
#!usr/bin/perl -w
my %do_these;
@ARGV = ("sinx.pl","nvidia.pl","changeName.pl");
foreach (@ARGV){
print $_;
$do_these{$_} = 1;
}
while(<>){
if(/^## Copyright/){
delete $do_these{$ARGV};
}
}
@ARGV = sort keys %do_these;
$^I = ".bak";
while(<>){
if(/^#! /){
$_ . = "## Copyright (C) 2011 by yujianjun";
}
print;
}
基本的にはこれで終わりですが、必要に応じて修正してください。Script Houseをもっと応援してください。
関連
-
Perlのprint、printf、sprintfの使用例について説明します。
-
Perl学習チュートリアル - シングルラインコマンドの説明
-
EditPlusでPerlの開発コンパイル環境を設定する
-
日付と時刻を操作するためのPerlのCPANモジュール10個の紹介
-
Tesseract-OCRを使用したPerl Captcha認識チュートリアル
-
Perl プロセスの PID ルックアップの例
-
Perlのハッシュの使い方チュートリアル
-
[解決済み] Perlで「ハッシュの代入の要素数が奇数である」という警告が出る
-
[解決済み] perl で awk コマンドを実行する
-
[解決済み] Perl の "make_path" と "remove_tree" は、オプションハッシュが空の場合、異なる結果になります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Perlグラフィカルパッケージ管理ツール PPMラーニングノート
-
PerlでローカルタイムからUNIXタイムスタンプに変換する方法
-
perl による生物学的突然変異のランダムシミュレーションコード
-
File::Basename を使用してファイル拡張子を取得する Perl コード
-
perlは{}で変数名を変更する方法を共有します。
-
重複するコンテンツ(重複する行+重複するフィールドの配列)を削除するための perl スクリプトコード
-
コンストラクタでのPerlメソッド使用法入門
-
[解決済み] strict pragma のもとで変数を NULL に設定するにはどうすればよいですか?
-
[解決済み] Perlスクリプトにコンパイルエラーがないことを確認する方法は?
-
[解決済み] の記述はどういう意味ですか?