3

私はperlで次のようなことをするのは簡単だと思います:

   print "File not found, valid files are:\n\n".`ls DIRECTORY | grep 'php'`;

   `rm -rf directory`

   my @files_list = split("\n", `ls DIRECTORY | grep 'FILE_NAME_REGEX'`)

そのようなことをするのは悪い習慣ですか?すべてを丹念に実装するよりも、これを行う方がはるかに簡単だと思います。私はPerlをbashの高度なバージョンとして扱います。

4

5 に答える 5

12

外部バイナリの使用は次のとおりです。

  1. 非常に非効率的
  2. 安全でない可能性がある
  3. ポータブルではありません(thx @friedo)
  4. 怠惰な...ほとんどの場合、あなたがそれを探しればあなたが望むことをするPerlモジュールがあります

この特定のケースでは、File::Globモジュールを見てください。

于 2012-11-27T20:09:00.763 に答える
7

それは、プログラムの予想される寿命に依存します。それがあなた自身だけを使うつもりであるか、それが一回限りのものとして意図されているものであるならば、それは完全に問題ありません。それが元々設計されたものです:「最初はUNIXオペレーティングシステム用のグルー言語として設計されました...」(ProgrammingPerl、第2版、ixページ)。

一方、大量に使用したり、広く配布したり、複数のOSで実行したりすることを目的としたプログラムの場合は、CPAN経由で入手できる組み込みおよび多数のパッケージを使用するのが最適です。

いずれにせよ、おそらくrmを呼び出す代わりにunlink関数を使用し、grepを呼び出す代わりにgrepまたはmap関数を使用する必要があります。

于 2012-11-27T20:24:48.420 に答える
5

そして今、反対意見のために。@transistor1がコメントで言ったようにTMTWOTDI 。また、Perlのwhipituptitudeの力を呼び出すこともできます。cpモジュールよりmvも慣れ親しんでFile::Copyいて、移植性について心配しておらず、プログラムが1つか2つの余分なプロセスを開始することでパフォーマンスが低下する余裕がある場合(ヒント:おそらく可能です)、Perlを使用すると簡単にこれらのツールをプログラムに統合すれば、可能な限り迅速にタスクを実行するために利用可能なツールを使用しても問題はありません。

そして、Perlでジョブを実行する方法を知っている場合でも、Unixユーティリティがジョブに適したツールである1回限りのタスクが存在する場合があります。

# I need log.err plus the next two oldest and the next two newest 
# files in the current directory. Should I say

chomp(@f = qx[ls -t | grep -C2 log.err]);

# or

@e = sort { -M $a <=> -M $b } glob("*");
($i) = grep { $e[$_] eq 'log.err' } 0..$#e;
@f = @e[$i-2 .. $i+2];

# or

use Acme::OlderNewer::FileFinder;
@f = find_oldernewer_files(".", "log.err", -2, +2);

# ?  Or suppose I want a list of all the *.pm files under all 
# directories in @INC, and we lucked out so that nothing in @INC
# has any spaces or special characters. 
# Is my script any less useful for saying

chomp(@f = `find @INC -name \\*.pm`);

# than

use File::Find;
find( sub { /\.pm$/ && push @f, $File::Find::name }, @INC );
于 2012-11-27T20:36:30.997 に答える
4

バックティックの使用は通常遅く、やや安全ではありません。必要なアクションによっては、perlはそれほど難しくなく、何をすべきかを知っている必要があります。例えば:

print "File not found, valid files are\n\n", grep /php/, glob 'DIRECTORY/*';
unlink glob 'directory/*'; 
rmdir 'directory';
my @files = grep /REGEX/, glob 'DIRECTORY/*';

Perlは怠惰なことに対応するように構築されていますが、bashで行う通常のことのほとんどは、perlで簡単に行うことができます。やり方を学ばないのはあなたの呼びかけですが、たくさんやればもっと楽になると思います。

于 2012-11-27T20:12:49.220 に答える
0

ほとんどのエンジニアリングの質問と同様に、答えは「状況によって異なります」です。

Perlをスクリプト言語として扱うと、移植性、保守性、実行速度、および最小限の時間で完了する前にタスクを取得するための他のプロパティが犠牲になります。これらの犠牲を払うことの結果は一定ではなく、むしろプログラムの複雑さの関数です。プログラムが複雑になるほど、保守性の点で、気まぐれで得られるよりも多く支払う可能性が高くなり、砲撃によって悪い選択をする可能性が高くなります。

ここには普遍的に正しい答えはありません。場合によっては、一度動作するスクリプトが必要になります。他の人では、それが数回動作する必要がありますが、それは短いです。また、数百のソースファイルにまたがる数万行のアプリケーションを作成している場合もあります。それが使用されるシナリオは、ある種の完全なルールではなく、どのツールが最も適切であるかを決定します。

時々、あなたはこのアプローチが「怠惰」として嘲笑されるのを見るでしょう。そしてそれがそれです。上記を考慮し、パラメータが変更されたときにアプローチを変更する意欲を維持するかどうかによって、良い種類の怠惰に従事しているか、悪い種類の怠惰に従事しているかが決まります。本当に怠惰な人は、時々最も怠惰なことは最初からやり直すことであることを知っています。

于 2012-11-28T02:08:41.017 に答える