質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

2回答

1360閲覧

Perl正規表現の部分マッチ構文ワンライナーの解説をお願いします。

noc

総合スコア73

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2022/05/03 04:22

fzf の key-bindings.zsh にて、以下のperlワンライナーを見かけました。
この (/^\s*[0-9]+\**\s+(.*)/, $1) の部分がよくわからないので解説していただけないでしょうか?

shell

1fc -rl 1 | perl -ne 'print if !$seen{(/^\s*[0-9]+\**\s+(.*)/, $1)}++'

恐らく、コマンドが被った行をフィルタしていると推測します。
後置if で条件にマッチした行だけを print していて、seen というハッシュにコマンド文字列をキーとして登録して、次回同じコマンド文字列が来たときには print しないようにしていると思われます。
/^\s*[0-9]+\**\s+(.*)/(.*) の部分でキャプチャしたい部分を指定しているかと存じます。$1 は正規表現キャプチャの1番目という意味でしょうか?
そして perl のワンライナーの仕様がよくわかっていないのですが、脈略なくいきなり正規表現が登場したら、その正規表現はパイプで標準入力から渡ってきた行に適用されるということでよろしいでしょうか?そして (正規表現, 文字列) のように正規表現を括弧で括って , の後に文字列を置くと、その文字列が最終的な出力値になるということでしょうか?

(ちなみに fc はzshのヒストリを表示するコマンドです。 4465 echo AAAA のように、行頭にヒストリ番号、空白の後にはコマンドという行を表示します。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

-nオプションと $_の説明はotnの回答にある通りです。
次のようにしてみれば、$1に何が入っているのかは理解できると思います。

fc -rl 1 | perl -nle '(/^\s*[0-9]+\**\s+(.*)/, $1); print $1'

つまり、fcの出力のうち、先頭コラム(ヒストリー番号、*が後置される場合もある)を除き、残りの部分(ヒストリーの実質の部分)を取り出して何かしようとしています。

ハッシュを使っているのはご推察の通り重複ヒストリーの除去が目的でしょう。ヒストリー番号を無視したうえで内容が同じであるヒストリーのうち初出のものだけを出力しようとしているようです。

投稿2022/05/03 09:40

KojiDoi

総合スコア13669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

脈略なくいきなり正規表現が登場したら、

の場合は、$_という特殊変数の内容とマッチされます。起動オプション-nの働きで、
「標準入力の内容を1行ずつ$_に入れて、各行についてスクリプトを繰り返し実行」
ということになります。

そして (正規表現, 文字列) のように正規表現を括弧で括って , の後に文字列を置くと、その文字列が最終的な出力値になるということでしょうか?

これは、普通の括弧と、普通のカンマ演算子だと思います。C等他の言語の括弧やカンマ演算子と同じ。
ということで、カンマ演算子の右項の値になる。

投稿2022/05/03 04:59

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noc

2022/05/03 11:07 編集

ありがとうございます。`-n` について把握いたしました。 > これは、普通の括弧と、普通のカンマ演算子だと思います。C等他の言語の括弧やカンマ演算子と同じ。 > ということで、カンマ演算子の右項の値になる。 ここがわからないのですが、perl ではカンマで要素を続けた場合、最後の要素がそれの全体の値となるのでしょうか?
otn

2022/05/03 15:45

コンマ演算子: https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E%E6%BC%94%E7%AE%97%E5%AD%90 この説明は、C/C++についてですが、Perlを含む他の多くの言語でも同じです。 もちろん文脈によっては、カンマは関数引数や配列リテラルなどの区切りの意味も持ちますが、Perlで言うところのスカラー文脈では、二項演算子で、左項の値を捨てるという意味があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問