- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlのsystem関数内でのコロンについて)
Perlのsystem関数で変数展開後にコロンを渡す方法について
このQ&Aのポイント
- Perlのsystem関数内で変数展開について困っています。変数展開はできるのですが、その変数の後に':'(コロン)をつける必要があるのですが、それがモディファイアとして認識されてしまうようです。
- コロンをそのままperlに評価させずにsystem(shell)に渡す方法はないでしょうか? $host = "xxxx.com"; system("program ${host}:22");ちなみに、$host:22ではうまく変数展開されないそうで、{}を使うまでは良かったのですが、その後のコロンでつまっています。programの都合でhost、コロン、ポート番号を渡す仕様のため変更できません。
- Perlのsystem関数内で変数展開後にコロンを渡す方法が知りたいです。変数展開はできるのですが、コロンを直接渡すとモディファイアとして認識されてしまいます。programの仕様でhost、コロン、ポート番号をそのまま渡す必要があるため、解決策を教えてください。
- みんなの回答 (3)
- 専門家の回答
お礼
// まちがって別のにリプライをつけてしまいました。正しくはこちらです。 遅くなりましたが、元のスクリプトを分離してテストケースを作成しました。programは実際にはstoneというものです。 さて、コマンドラインからは実行できます。 $ stone `cat ~/remotehostname`:22 1026 -> OK $ stone stone $remotehostname:22 1026 -> OK これは自ホストのポート1026に来たパケットをリモートの22にフォワードするもので、両方共動作しました。 これが動作したということはシェルのモディファイアじゃないですね。これもシェルが評価しているんだし。 さて、以下のテストケースを実行すると、 #! /usr/bin/perl $remotehostname = `cat ~/remotehostname`; system("stone ${remotehostname}:22 1026"); Invalid <host>:<port>: 048.112137072.m-net.ne.jp sh: line 2: :22: command not found このようにホストの後に改行があって:22というコマンドが無いと出ます。これを見てモディファイアかと誤解したのですが、どうもそうではなく、ご指摘のようにホスト名の後の改行を誤って(正しく?)認識しているようです。 であれば、簡単で chop($remotehostname); これを挿入することで正しく動作することができました。ありがとうございました。ホスト名の後の改行が大きなヒントでした。