現在、Perlでテンプレート処理みたなものを自作しています。
例えば
my $str = <<'TEST';
test
$test
$test2
test
TEST
my $test = 'test';
$str =~ s/(\$\w+)/eval($1)/eg;
print $str;
exit;
のような感じの時に(実際には特定の記号の範囲内にてサブルーチンや
Perl構文なども処理できるようにしていますがこの際には例外処理や
複雑な処理などは一切考慮しないものとします)置換結果が空白で
前後が改行などのみになった場合にその行を削除したいのですが
どうしたらよいのでしょうか。
>>例(上記の場合の実行結果)
----------
test
test
test
----------
↓(理想)
----------
test
test
test
----------
No.3ベストアンサー
- 回答日時:
凝った方法はあるのかもしれんけど, そんなことより「思考をそのままソースに書く」ことの方が一般には重要.
でもって状況を確認したいんですけど,
・「あと、上記の例では簡単にするために1行単位にしていますが実際には
もっと処理が複雑で1行内に複数の変数が含まれていることもあります。
(gオプション付)」というのはどういうことでしょうか? 文章の前半と後半がかみあっていないんですけど.
・「マッチした部分を置換した行が結果的に
^(\s*\n?)$
であればその部分(改行含)は出力せず、それ以外なら出力させたい」というのは, 「置換した部分を含めた全体が」という解釈でいいですか?
あと, 文字列の先頭と末尾は \A, \Z でマッチしませんでしたっけ?
この回答への補足
ありがとうございます。
こちらの説明不足と当初の想定していた仕様範囲の想定及び説明の
間違いなどがありまして、皆様にご迷惑をおかけして申し訳ありません。
皆様の回答を見ながらなんとか想定していたものを実現できたようです。
実際には &{~}& の範囲内をPerl構文として実行したかったのです。
因みにこの間は改行を含めることができたり、1行内(この1行とは
&{~}& の範囲は無視)に複数入れたりできるというようにしたかった
のですがこの説明をするとややこしくなるかなと思った上で省略したら
余計にややこしくなってしまいました。
結果的に
# 対象文字列
my $str = <<'TEST';
test
&{
return $test;
}& &{
return $test2;
}&
test
TEST
#my $test = '$test';
#my $test2 = '$test2';
# 変換用のサブルーチン
my $func = sub {
my $str = shift;
$str =~ s/&{(.+?)}&/eval($1)/egs;
if($str =~ /^\s*\n?$/s) {
return;
}
return $str;
};
# 変換
$str =~ s/((([^\n]*?)&{(.+?)}&(?=[^\s]*))+(\n?))/&$func($1)/egs;
# 表示
print $str;
exit;
こんな感じになりましたがもしかすると間違いがあるかもしれません。
No.5
- 回答日時:
仕様がよくわかりません。
。。・$に続く変数名っぽい文字列があれば、変数として展開
・空白行は削除(連続する改行は1つに詰める)
って言うことでいいでしょうか?
2行になりますけど。
$str=~s/(\$\w+)/eval($1)/ge;
$str=~s/\n{2,}/\n/g;
# $str=~s/\s{2,}/\n/g; # スペースのみの行も消すなら
検証
my $aaa='hoge';
my $bbb='page';
my $str=<<'END';
test
$aaa
$bbb
$ccc
test
END
$str=~s/(\$\w+)/eval($1)/ge;
$str=~s/\n{2,}/\n/g;
print $str;
-- 結果 --
test
hoge
page
test
No.4
- 回答日時:
あまり洗練されていませんが、一番簡単なのは while ループで1行ずつ処理することだと思います。
use strict;
my $str = <<'TEST';
test
$test
$test2
test
TEST
my $test = 'test';
my $test2 = '';
while ($str =~ /(.*\n)/g) {
my $line = $1;
if ($line =~ /^\s*\n/) {
print $line;
} else {
$line =~ s/(\$\w+)/$1/eeg;
print $line if $line !~ /^\s*\n/
}
}
No.2
- 回答日時:
s/// で置換ができたかどうかはその値でわかりますから, 「置換ができて空白だけになった」場合を除いて出力すればいいのでは? 例えば
unless($str =~ s/// and $str =~ /^\s*$/) {
print $str;
}
みたいな感じでいけると思うんだけど.
この回答への補足
ありがとうございます。
やはり、正規表現で一発というわけにはいかないでしょうかね。
前方一致やら後方一致なども考えたのですがなんか上手くでき
なかったりして。
基本的には一つの文字列内に複数の変数が含まれているとします。
あと、上記の例では簡単にするために1行単位にしていますが実際には
もっと処理が複雑で1行内に複数の変数が含まれていることもあります。
(gオプション付)
マッチした部分を置換した行が結果的に
^(\s*\n?)$
であればその部分(改行含)は出力せず、それ以外なら出力させたい
のです。
(因みに結果が 0 の場合は出力します)
連続の改行(及びマッチしていない行の空行)はそのまま出力します。
^ と $ は行レベルでマッチしない(?)ようですし...。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelの置換が上手くいかない Microsoft® Excel® 2019 MSO (バージョン 5 2022/08/17 22:26
- Excel(エクセル) Excel VBA 空白行があるセル範囲に色を付ける 3 2022/06/13 15:58
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- HTML・CSS 【CSS】特定のリンクを含むaタグを指定できるかどうか? 3 2022/10/15 02:45
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- Visual Basic(VBA) ブックのCOPY 4 2023/02/25 20:17
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- JavaScript [再掲]指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードについて 1 2023/05/10 15:09
- サーバー Windowsサーバでグループを検索したい 1 2023/04/17 15:30
- Visual Basic(VBA) VBA ステータスバー DoEvents 1 2023/03/30 12:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl の外部モジュールの利用方法
-
ファイルアイコンの左下に緑の□...
-
perlのプログラミング 部分入れ...
-
ペプシコーラとコカ・コーラとD...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
-
perlについての質問
-
Blenderについて
-
perl このテキストファイルを簡...
-
Perlでファイルの末尾から指定...
-
秀丸での一括変換について
-
英数文字列のうちの数値を4桁に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
INDIRECT 横に再度抽出したい
-
Perl の外部モジュールの利用方法
-
Perlで特定文字列から特定文字...
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
Strawberry Perl for Windows ...
-
perlで2次元配列をサブルーチ...
-
TeraPadエディターの操作方法に...
-
アルファベットに付いて質問し...
-
perlのflock関数でロックをかけ...
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
Perlで時間の計算
-
perlのrequireの動き方について...
-
perlでリテラル値はメモリにど...
-
画像が表示でnull; this.src
おすすめ情報