• 締切済み

ドル記号+アルファベット

返りや変数の「値」の中にどうしても $+アルファベットのものがあります。これは覆せない前提です。 このまま何らかの処理 (たとえば置換) に渡すと、あらかじめ値を書き出すか否かに関わらず、$ が文字としてみなされず、どうしても変数として展開されてしまいます。 もらう値については事前にエスケープできない (上記のとおり、前提です) ので、どうすればよいでしょう。

  • -ROM
  • お礼率19% (78/407)
  • Perl
  • 回答数12
  • ありがとう数10

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.12

あ, test2.pl を付け忘れました. -------------------- ここから -------------------- #!/usr/local/bin/perl print "$ARGV[0]\n"; exit; -------------------- ここまで -------------------- です. 正直なところ, 「Unix系 OS」の正体はわからないしどんなシェルを使っているかもわからないので, どうしようもないですねぇ.

-ROM
質問者

補足

まったく解決にたどりつく様子はないですが、別の質問を投稿しようとしたら「アクティブ質問数の上限に達しています」と怒られたので、これを閉め切らざるを得ません。       また、まったく同じ内容で後日に質問します。  

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.11

#9 の回答のところですが, 以下に示すように手元では再現できません. 個人情報が入っているのでプロンプトは手を入れましたが, 基本的に script の出力と同じです. -------------------- ここから -------------------- Script started on Wed Feb 13 18:08:23 2008 > zsh > perl test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t' yInH4u$a6Fja/uW$gk8.Nf3t > exit > bash $ perl test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t' yInH4u$a6Fja/uW$gk8.Nf3t $ exit > csh /etc/.cshrc: No such file or directory. % perl test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t' yInH4u$a6Fja/uW$gk8.Nf3t % exit Script done on Wed Feb 13 18:08:39 2008 -------------------- ここまで -------------------- ちなみに uname -a の出力は Linux localhost 2.6.22.1 #1 SMP Mon Jul 16 14:05:02 JST 2007 x86_64 Intel(R) Xeon(R) CPU 5160 @ 3.00GHz GenuineIntel GNU/Linux です. bash -c "perl test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t'" だと yInH4u/uW.Nf3t になるんですが. というか, そもそも「シングルクオートで変数展開しようとする」シェルの存在が理解できない.

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.10

質問者による ANo.9 への補足は,ANo.6~8 への回答になっていません。 なぜ前段階で変数展開されるのか知りたいから,   (0) 何らかのシェルを起動して という所からすべて提示してほしいと言ったのです。 重要だと思われるこの部分,質問者の判断で省かれてしまっています。 >--- スクリプト全行開始 >--- スクリプト全行終了 などの,コンピュータが出力したのではない質問者による補足,も不要です。 (もしかして catコマンドによるソースコードの画面表示ではないのですか?) ANo.6の繰り返しになりますが, シェルが表示するプロンプトも,あなたが入力したすべてのコマンドも,すべて込みで,一連の画面表示をまとめて提示していただくわけにはいきませんか。

  • bgbg
  • ベストアンサー率53% (94/175)
回答No.9

(1)正確な環境を書きましょう。   Unix系OSなんて括りの環境は星の数ほどあります。 (2)正確に問題を切り分けましょう。   当該の文字列が入った変数を、絶対に変数展開されない方法(unpackでバイト単位で表示する等)で出力してみましょう。   '$'(0x24)が含まれていなければ、perlスクリプトは『問題なし』です。 (3)事象を正確に報告する。   他の回答者が仰るように、前処理の段階で変数展開されていたら、perlスクリプト側での対処は『不可能』です。   これを正確に、根拠を付けてに報告することもエンジニアの仕事です。

-ROM
質問者

補足

--- スクリプト全行開始 #!/usr/local/bin/perl # # test2.pl print $ARGV[0]; exit; --- スクリプト全行終了 で perl /path/to/test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t' とするとやはり yInH4u/uW.Nf3t と出力されてしまいます。 ということで > 前処理の段階で変数展開されていたら、perlスクリプト側での対処は『不可能』 ということのようです。

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.8

No.5さんのご指摘と >たとえばコマンドライン引数です。 ということから想像すると,シェルの展開だと思うんですけどね Ubuntu7.10のbashにperl5.8.8です. #hoge.pl print $ARGV[0]; としておいて perl hoge.pl "6$ABC/" とすると確かに 6ABC としかでません.シェルが展開してるわけですから. perl hoge.pl '6$ABC/' なら,展開しないので,6$ABC/ とでてきます. # test.pl $a = 'yInH4u$a6Fja/uW$gk8.Nf3t'; print $a; これを素直に実行して, yInH4u$a6Fja/uW$gk8.Nf3tとでないことは ありえないでしょう.

-ROM
質問者

補足

コマンドライン引数は一つの例ですが、最初に申しましたように入力に対して前処理を指定できないので、引用符云々は別問題として考えてもらえませんか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

えっと.... 差し支えなければ, 「実際にどのように Perl スクリプトを実行しているのか」を, 渡す引数を作るところを含めて書いてもらえませんか? 最悪「シェルが展開するので Perl スクリプトとしては対処不可能」という可能性もありますので.

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.6

念のために。 ANo.2のように,一連の画面表示をまとめて提示していただくわけにはいきませんか。 ANo.3では,Linux環境でもその現象は起こらないと報告されていますので。 (0) 何らかのシェルを起動して (Windowsのように標準シェルはcmd.exeだけではないので) (1) Perlのversionを確認 (2) cat /path/to/test.pl (3) perl /path/to/test.pl という一連の流れです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

なんとなく Perl の問題ではないような気がします. 「実際のデータ」は外部から渡されるわけですよね? どのように Perl スクリプトに渡しているんでしょうか.

-ROM
質問者

補足

たとえばコマンドライン引数です。 「それなら、その引数中のドル記号をあらかじめ置換するかエスケープすれば?」ということは「なし」でお願いします (事前にいじらないことが前提です)。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

$a = 'yInH4u$a6Fja/uW$gk8.Nf3t'; ダブルクォートで実行していませんか? 先頭に use strict; を付けて 実行してみてはどうでしょう。変数名と認識されているならエラーになる はずです。

-ROM
質問者

補足

二重引用符にはなっていません; なぜなら、下記は試したスクリプトそのものです。 それと、最初に書きましたように、実際の使用では、$a = 'なんたらかんたら'; と書き出したりはしませんし、ドル記号の数や位置、アルファベットや数字はスクリプトの走る回ごとに異なりますので、単引用符も二重引用符もないのです。 その線でお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

手元の Linux (Gentooベース) + perl 5.8.8 とか FreeBSD + perl 5.005 でも, 展開されず期待された動作をしてます.

関連するQ&A

  • 【PHP】変数がアルファベットかどうか知りたい

    PHP初心者です。 わからない変数 $x があるとして、これがアルファベット(1文字)か否かを知りたい場合どうすればいいでしょうか? a~zを全部比較するのは大変ですし。 含まれているかどうかではなく「完全一致」の比較です。 お詳しい方、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • Perlで変数中のエスケープされた特殊文字を展開

    Perlで、変数に既に格納されているエスケープされた特殊文字を、もとの文字に展開するには どのようにしたらよいでしょうか。 つまり、\t という値で格納されているのをタブ文字にしたり、\\ という値であれば\の一文字に するという事です。 ダブルクォートで定義すれば展開されると思いましたが、展開は変数の代入時に行われるだけで、 既に変数中にエスケープされて入っているものはダブルクォートを使い変数を囲んだりしても展開されません。 下記は簡単な例でやろうとしてる事を示したものです。 add変数に\tというタブを意味するエスケープされた特殊文字を含んでいるとして、その\tを タブとして展開し、abc defのようにさせたいのですが、abc\tdefと入ってしまいます。 $ cat unescape.pl #!/bin/perl $add = '\tdef'; #シングルクォートで代入すると、もちろんエスケープされたまま代入される #$add = "\tdef"; #ダブルクォートで代入すると代入時にタブへ展開される #$add = $ARGV[0]; #本当はAGRVからエスケープ特殊文字を含んだ文字列を取りたい。ARGVから代入すると、シングルクォートの時のようにそのまま代入される $tgt = 'abc'; print "add: " . $add , "\n"; print "before: " . $tgt . "\n"; $tgt .= "$add"; #既にエスケープされた形で代入されているものを、ダブルクォートで囲んで使っても展開されない print "after: " . $tgt . "\n"; $ perl unescape.pl add: \tdef before: abc after: abc\tdef

    • ベストアンサー
    • Perl
  • 文字列の置換

    変数に含まれる isbn:・・・・ asin:・・・・ という文字列を <a href="http://<略>/・・・・/">isbn:(asin:)・・・・</a> と置換したいのですがどのように処理すればいいかわかりません。 isbn,asinは半角で大小文字の区別は無し :の後はアルファベット・数字・_です。

  • シェル(ksh)で変数にある文字列を取り出す

    お世話になります。 シェルで変数(例えば:OUT)に入っている文字列ついて2つ質問させてください。 1:変数に入っている文字列を後ろから何文字(固定長)取り出したい場合にどのようすればよいか教えてください。 試してみたのは以下です。 OUT1=abcde #変数OUT1に文字列abcdeを代入 OUT=${OUT1:3:(-1)} (固定長3バイト後ろから取り出したい(cde)) をファイルに書きこんで起動すると、上記の処理にいったところで、"置換が正しくありません"とでてしまいます。 2:変数に入っている文字列の文字数を取り出したい。 試してみたのは以下です。 OUT1=abcdec #変数OUT1に文字列abcdeを代入 OUT=${#OUT} これは、コマンドラインでecho ${#OUT}とすると6と文字数を表示してくれますが、ファイルに書きこんで起動すると上記同様"置換が正しくありません"と表示されてしまいます。 OSは、SUN OS 5.8です。 わかるかたがいらっしゃたら教えてください。 宜しくお願いします。

  • perl tr での変数の使い方

    tr を使って文字列を置換する時に 検索文字列や置換後の文字列のリストとして変数を使いたいのですがうまくできません。 tr はコンパイル時に変数を展開するので eval を使わないといけないという記述を見つけたのですが そこから先のやり方がわかりません。 eval "tr/$ab/$cd/"; のように書くというような記述までは見つかるのですけれど これを使ってどうすれば変換ができるのかわからないのです。 どなたか教えてください。 (初心者でごめんなさい。eval とか全然使い方がわかりません…)

    • ベストアンサー
    • Perl
  • perlでの正規表現について

    文字列のなかの"<タグ>(アルファベット1文字)"すべてに対して置換処理をさせたいのですがうまく動作しません。 現在はこう記述しております。 $str=~ s/(~<(.*?)>\w)/置換文字列/g; 良い方法があれば教えていただけると助かります。

  • WordVBA 置換処理での改行文字の可否

    (実際にはExcelのVBAからWordファイルを開いての処理になるのでExcelのVBAで組んでいますが、) WordのVBAで、置換処理を作成しています。 keyword1 = "検索文字" keyword2 = "置換文字" With objSelection.Find .Text = keyword1 .Forward = True .MatchWholeWord = True .Replacement.Text = keyword2 .Execute Replace:=wdReplaceAll End With 置換処理自体は出来ています。上記処理は置換部分の抜粋です。 しかし行いたいことはタイトルにもあります通り、置換文字中に改行を含めた状態での置換処理です。 長い文字列を置換するだけなら問題ないのですが、改行を含めてしまうと改行文字が別の文字に置き換えられてしまうようです。 置換先でも改行された状態にしたいのですが、これは書き方に問題があるのでしょうか? もしくは置換処理ではなく、他の方法を取る必要があるのでしょうか? 教えてください。よろしくお願いいたします。

  • 各セルの一番最初から3番目までの値の塊だけを置換

    ああああああ があって あ を い に普通に置換すると いいいいいいい になりますが各セルの一番最初から3番目までの値の塊だけを置換し置換し 検索文字あ 置換文字いの時 結果は いいいあああ にしたいです 検索文字を一つの値の塊とします ああうえお があって 検索文字え 置換文字 空白 の時 え は4番目の値の塊なので ああうえお はそのまま変化なく置換したくありません 文字別に文字数を数えるというのではなくセル内で 一番左 から何番目に出てくるという基準で指定した値の塊を置換したいです 値の塊は一文字とは限りません あああああい を検索文字 ああああ 置換文字 い の時 結果は いあい にしたいです この時はああああが一つの値の塊です この時検索文字 ああ 置換文字 い のとき 結果いいあい 検索文字あ 置換文字い のとき結果は いいいああい 検索文字を一つの値の塊とします こういうことがA列の60000行のセルにできる式、マクロを教えてください 一つの値だけでなく複数の値を同時に検索し置換できるほうが良いです

  • HTMLエスケープ処理とデーターベース

    初歩的な事で申し訳ありませんがご教授下さい。 フォームから受け取った文字列をデータベースに格納し、必要に応じて出力するような処理でのHTMLエスケープについて質問です。 (前提条件として、HTMLタグは使用をさせない。フォームに入力する文字列には、< や >を使う必要性はほとんどないものとします) HTMLエスケープ処理は、どのタイミングで行うのが普通でしょうか? 1.JavaScliptで特定文字 < や > を入力させない。 2.サーバーサイドで特定文字 < や > を入力させない。 3.DBに格納する前にエスケープして、エスケープ処理後の文字列をDBに格納する。 4.DBにはそのまま格納し、出力のさいにエスケープ処理を行う。 5.どこでもかまわない。 6.その他 今まで私はあまり意識する事なく(4)を選択していたのですが、最近他の人の作ったプログラムを見る機会が増えて、その違いにちょっと気になりました。 正解はないのかも知れませんが、一般的な方法と、そのメリット、デメリット等、教えて頂けると助かります。

    • ベストアンサー
    • PHP
  • 【エクセル】文字列置換について

    エクセルでの文字列置換についてお教えください。 一部の文字列が含まれていたら、置換するという処理は可能ですか? 例えば、 ”ああああいいいい”  ”ああああうううう” ”ああああええええ” セルに、上記の文字列が、あったとして、 ”ああああ”が、含まれていたら、 すべてのセルを、”おおおお” に、置き換える(差し替える)という処理を想定しています。 よろしくお願いいたします。

専門家に質問してみよう