2016-11-20 8 views
0

私は/path/to/file.txt perl正規表現置換の中でモジュール修飾された関数を実行しますか?

echo "/path/to/file.txt" | perl -pe 's{(.*)}{File::Basename->dirname($1)}ge' 

/path/to/に変換するには、次のperlのワンライナーを持っているが、私は、 File::Basename->dirname()の私の呼び出しで何かが欠けて次のエラーの原因となっています:

Can't locate object method "dirname" via package "File::Basename" (perhaps you forgot to load "File::Basename"?) at -e line 1, <> line 1. 

私は何をしないのです?

(私はちょうどbashのdirnameを使うことができますが、私はこれを削除した例よりも、perlでもっと複雑なことをしようとしています)。

+0

答え使用できるように、ベース名は、デフォルトでdirnameをエクスポート: 'エコー「/path/to/file.txtを」 | perl -Fileile :: Basename -pe '{([^ \ n] +)} {dirname($ 1)} ge'' –

+1

このモジュールから_all_関数をインポートする方法に注意してください。特定のものだけをインポートするには、 '-MModule = func'を使用してください。 – zdim

+0

お勧めします。 'Dirname'と' basename'を使い、便利に使えるようにする必要があります。D –

答えて

0

問題はあなたが置換文字列に<button>を持っていたことでしたが、あなたはそれが

を動作するはずですので、あなたが/e修飾子を使用している場合、今、置換文字列が有効なPerlの式でなければならないことを削除した、と

<button>File::Basename->dirname($1) 

正しいコマンドは次のようになり、有効なPerlの


ではありません。

echo "/path/to/file.txt" | perl -pe 'use File::Basename 'dirname'; s{([^\n]+)}{dirname($1)}ge' 
+0

'button'を削除した後、' 'File :: Basename"というパッケージを使ってオブジェクトメソッド "dirname"を見つけることができませんおそらく、 "File :: Basename"をロードするのを忘れていましたか?)-e line 1、<> line 1'。私は質問を更新します。 –

+1

[File :: Basename'のドキュメント(https://metacpan.org/pod/File::Basename)を見てください。モジュール*は 'dirname'をエクスポートします。それはオブジェクト指向のモジュールではありません。だから 'use File :: Basename 'dirname''が必要で、' dirname($ 1) 'だけで呼び出すことができます。 – Borodin

+0

... 1行のサブプログラムモードでは、perl -Mでのみ可能です。返信いただきありがとうございます。 –

1

あなたは上記の=dirnameを必要としないので、デフォルトでFile::Basenameモジュールの輸出、そのすべての機能-MModName=func

perl -MFile::Basename=dirname -pe 's{(.*)}{dirname($1)}ge' 

でモジュールをロードします。しかし、これはモジュールによって異なり、主にシンボルをインポートする必要があります。 1つのライナーでそれを行う方法の詳細については、-MスイッチがCommand Switches in perlrunであることがわかります。

+0

ビンゴ、モジュールがロードされていないのを忘れてしまった'-M'なし。 –

+0

これを拡張して(私はいくつかのHTMLを作成しようとしています)、 '/ {dirname($ 1)} 'を'/e'スイッチなしで評価と組み合わせることができます。唯一のコストは、通常の '{} {} g'構造体を使うことができず、より一般的な' s // g'構造体に戻らなければならないことです。 –

+0

@ Sridhar-Sarnobatスクリプトに切り替えるには...?それはすべてが突然もっと簡単になるだろう:) – zdim

1

エラー#1:

メッセージなどは(?は、おそらくあなたは、 "ファイル::ベース名"をロードするのを忘れて)、[ファイル::ベース名をロードする必要があります示唆しています。

perl -pe'use File::Basename; ...' 

または

perl -MFile::Basename -pe'...' 

エラー#2:

dirname方法ではないので、File::Basename->dirnameが正しくありません。それはFile::Basename::dirnameと呼ばれる必要があります。

perl -MFile::Basename -pe's{(.*)}{File::Basename::dirname($1)}ge' 

dirnameをインポートすることもできます。幸い

perl -MFile::Basename=dirname -pe's{(.*)}{dirname($1)}ge' 

、ファイル::あなたは、単に私の将来のコピー&ペーストのニーズに

perl -MFile::Basename -pe's{(.*)}{dirname($1)}ge' 
+0

すべての選択肢のおかげで、それは個人的な好みを見つけるために知って良いです。私はすべての3つの答えを正しくマークすることを望む。 –

関連する問題