dポイントプレゼントキャンペーン実施中!

返りや変数の「値」の中にどうしても $+アルファベットのものがあります。これは覆せない前提です。

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

A 回答 (12件中1~10件)

あ, test2.pl を付け忘れました.


-------------------- ここから --------------------
#!/usr/local/bin/perl

print "$ARGV[0]\n";
exit;
-------------------- ここまで --------------------
です.
正直なところ, 「Unix系 OS」の正体はわからないしどんなシェルを使っているかもわからないので, どうしようもないですねぇ.

この回答への補足

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



      また、まったく同じ内容で後日に質問します。



 

補足日時:2008/02/19 12:58
    • good
    • 0

#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
になるんですが.
というか, そもそも「シングルクオートで変数展開しようとする」シェルの存在が理解できない.
    • good
    • 0

質問者による ANo.9 への補足は,ANo.6~8 への回答になっていません。



なぜ前段階で変数展開されるのか知りたいから,
  (0) 何らかのシェルを起動して
という所からすべて提示してほしいと言ったのです。
重要だと思われるこの部分,質問者の判断で省かれてしまっています。

>--- スクリプト全行開始
>--- スクリプト全行終了

などの,コンピュータが出力したのではない質問者による補足,も不要です。
(もしかして catコマンドによるソースコードの画面表示ではないのですか?)

ANo.6の繰り返しになりますが,
シェルが表示するプロンプトも,あなたが入力したすべてのコマンドも,すべて込みで,一連の画面表示をまとめて提示していただくわけにはいきませんか。
    • good
    • 0

(1)正確な環境を書きましょう。


  Unix系OSなんて括りの環境は星の数ほどあります。

(2)正確に問題を切り分けましょう。
  当該の文字列が入った変数を、絶対に変数展開されない方法(unpackでバイト単位で表示する等)で出力してみましょう。
  '$'(0x24)が含まれていなければ、perlスクリプトは『問題なし』です。

(3)事象を正確に報告する。
  他の回答者が仰るように、前処理の段階で変数展開されていたら、perlスクリプト側での対処は『不可能』です。
  これを正確に、根拠を付けてに報告することもエンジニアの仕事です。

この回答への補足

--- スクリプト全行開始
#!/usr/local/bin/perl
#
# test2.pl

print $ARGV[0];
exit;
--- スクリプト全行終了


perl /path/to/test2.pl 'yInH4u$a6Fja/uW$gk8.Nf3t'

とするとやはり

yInH4u/uW.Nf3t

と出力されてしまいます。

ということで

> 前処理の段階で変数展開されていたら、perlスクリプト側での対処は『不可能』

ということのようです。

補足日時:2008/02/13 12:43
    • good
    • 0

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とでないことは
ありえないでしょう.

この回答への補足

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

補足日時:2008/02/13 09:36
    • good
    • 0

えっと....


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

念のために。


ANo.2のように,一連の画面表示をまとめて提示していただくわけにはいきませんか。
ANo.3では,Linux環境でもその現象は起こらないと報告されていますので。

(0) 何らかのシェルを起動して
(Windowsのように標準シェルはcmd.exeだけではないので)
(1) Perlのversionを確認
(2) cat /path/to/test.pl
(3) perl /path/to/test.pl

という一連の流れです。
    • good
    • 0

なんとなく Perl の問題ではないような気がします.


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

この回答への補足

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

補足日時:2008/02/12 20:22
    • good
    • 0

$a = 'yInH4u$a6Fja/uW$gk8.Nf3t';



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

この回答への補足

二重引用符にはなっていません; なぜなら、下記は試したスクリプトそのものです。

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

その線でお願いします。

補足日時:2008/02/12 17:13
    • good
    • 0

手元の Linux (Gentooベース) + perl 5.8.8 とか FreeBSD + perl 5.005 でも, 展開

されず期待された動作をしてます.
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!