• 締切済み

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

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

みんなの回答

  • 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