• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:perlの文字列組み合わせ)

perlの文字列組み合わせ

このQ&Aのポイント
  • perlで文字列の組み合わせを作成するプログラムを作成中です。
  • 入力文字列に対して1をA、2をB、3をCに置換するプログラムを作成中です。
  • 組み合わせを全て出力するためのプログラムを作成しているがうまくいかない。

質問者が選んだベストアンサー

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.16

#13です。 >あと、変換前にカンマの使用があります。 変換前の文字列にカンマがあるということなので、 変換するファイルをタブ形式で定義したバージョンのスクリプトを 参考URLに書きました。(バージョン3 (CL.3)になります。)(カンマをタブに替えただけす。) ファイルの1行は 変換前文字列<tab>変換後文字列1<tab>変換後文字列2<tab>・・・変換後文字列N の形式で定義してください。 <tab>はタブ文字"\t"を意味します。 変換前文字列、変換後文字列の何れも カンマ(",")を変換文字として使用可能です。 例 ,1<tab>A<tab>B は ",1"をAに変換し、かつ ",1"をBに変換します。 >ちなみに前文はケース2の場合を想定してました。 定義の方法はケース1で行っていますが、 どうしても定義2でなければいけない理由があるのでしょうか? もし、そうであれば、その旨補足ください。 スクリプトをケース2の形式に対応させるのは、簡単にできます。

参考URL:
http://climbi.com/b/3383/3
oguogu01
質問者

お礼

 出来ました!理想とするプログラムができあがって理解することも出来ました。 長々とお付き合いありがとうございました。 ケース2にしたかった理由は、変換される文字より変換後の文字の方が少なかったので、 テキストファイルが見やすくなると思ったのです。 ですが、作ってみると、ケース1の方が便利な理由が出来たので、このまま行きます。 本当にありがとうございました。 他の方も回答してくださっているようなので、そちらの方も勉強してみようと思います!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (15)

  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.5

具体的にどういう入力ファイルを想定しているのかはっきりしないので、私が書いたコードをベースに話を進めますが。 > ・入力する文字列は、複数の文書みたいなモノを入力するので、 > いただいたプログラムのように、スペースで文字毎を1個ずつ区切れない。 これの意味するところが、1 2 3のようなものではなくて、123のようなものを考えているならば、@z = split(//, $_)としてやれば配列に変換できます。@zはそのまま先のコードで使用できます。 >・入力する文字列にはAやBも存在する。(それについては変換しない) これも難しくないと思いますが。if文を置いて、変換対象の文字の場合のみ変換すればいいだけです。 >・変換文字は複数ある。 > %x = ~ > では、文字が多すぎるのです。 複数というのがいくつくらいかわかりませんが、なんらかの形でそれをコード内に記述する必要があります。それを連想配列でするか他の方法でするかだけの違いで、他の方法でできるのなら連想配列を使ってできない理由はないと思いますが。 もし、変換文字のマッピングが膨大でファイルであたえられているのであれば、それを読み込んで連想配列に変換してしまえばいいのでは。 いずれにしてもどういう入力形式を想定しているのかわからないと何とも言えません。実際の入力ファイルの一部を見せてください。 あと、配列に入っているようだが出力ができないということですが、それがこの質問の本質であるならば、具体的にどうやって出力していて、どういう出力になるのですか?

oguogu01
質問者

お礼

回答ありがとうございます。 文字の置換がperlは簡単だったので、これでやればいいやと思ってヤケドしてますw 連想配列について、正月に勉強しましたが、これが中々難しい・・・ 私の持ってる本がお粗末なのかもしれませんが、”split”について詳しく書かれていなく、 ネット検索もしましたが、イマイチわかりずらかったので他の手法を模索中しております。

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.4

#3です。 投稿した文章が 「現在、この回答はサポートで内容を確認中です。 ご迷惑おかけいたしますが、今しばらくお待ちください。」 となってしまったので、再度、投稿します。 前回のは、出力結果がソートされていなかったので、ソートするように変更しました。 以下のようにしてください。 ---------------------------------------- print "入力してください->"; chomp($inp1 = <STDIN>); $cont1 = length($inp1); @array = (); push @array,$inp1; %conv = ('1','A','2','B','3','C'); for ($i = 0; $i < $cont1;$i++){ $cont2 = scalar(@array); for ($j = 0; $j < $cont2; $j++){ $temp = $array[$j]; $char = substr($temp,$i,1); if (exists $conv{$char}){ substr($temp,$i,1) = $conv{$char}; push @array,$temp; } } } @array = sort(@array); printf("%d 通りの組合せがあります\n",scalar(@array)); foreach $str (@array){ print $str,"\n"; } ------------------------------------------------------- 最初の3行は、あなたのコードをそのまま使用しています。 以下、実行結果です。 入力してください->1A2B3C1x 16 通りの組合せがあります 1A2B3C1x 1A2B3CAx 1A2BCC1x 1A2BCCAx 1ABB3C1x 1ABB3CAx 1ABBCC1x 1ABBCCAx AA2B3C1x AA2B3CAx AA2BCC1x AA2BCCAx AABB3C1x AABB3CAx AABBCC1x AABBCCAx 不明点があれば、補足してください。

全文を見る
すると、全ての回答が全文表示されます。
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.3

以下のようにしてください。 --------------------------------- print "入力してください->"; chomp($inp1 = <STDIN>); $cont1 = length($inp1); @array = (); %conv = ('1','A','2','B','3','C'); push @array,$inp1; for ($i = 0; $i < $cont1;$i++){ $cont2 = scalar(@array); for ($j = 0; $j < $cont2; $j++){ $temp = $array[$j]; $char = substr($temp,$i,1); if (exists $conv{$char}){ substr($temp,$i,1) = $conv{$char}; push @array,$temp; } } } printf("%d 通りの組合せがあります\n",scalar(@array)); foreach $str (@array){ print $str,"\n"; } --------------------------------- 実行結果は以下の通り。 入力してください->1ABC2X2YZ3 16 通りの組合せがあります 1ABC2X2YZ3 AABC2X2YZ3 1ABCBX2YZ3 AABCBX2YZ3 1ABC2XBYZ3 AABC2XBYZ3 1ABCBXBYZ3 AABCBXBYZ3 1ABC2X2YZC AABC2X2YZC 1ABCBX2YZC AABCBX2YZC 1ABC2XBYZC AABC2XBYZC 1ABCBXBYZC AABCBXBYZC 不明点があれば、問い合わせください。

全文を見る
すると、全ての回答が全文表示されます。
  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.2

> ./foo 2 3 1 2 2 3 1 2 2 3 1 B 2 3 A 2 2 3 A B 2 C 1 2 2 C 1 B 2 C A 2 2 C A B B 3 1 2 B 3 1 B B 3 A 2 B 3 A B B C 1 2 B C 1 B B C A 2 B C A B

oguogu01
質問者

お礼

 早速の回答ありがとうございます。 プログラム見させてもらいました。  条件が複雑だったので省略しましたが、このプログラムでは ちょっと目的は達成できませんでした。 (早く作ってくださったのにごめんなさい) 条件としては ・入力する文字列は、複数の文書みたいなモノを入力するので、 いただいたプログラムのように、スペースで文字毎を1個ずつ区切れない。 ・入力する文字列にはAやBも存在する。(それについては変換しない) ・変換文字は複数ある。 このため、いただいたプログラムのように %x = ~ では、文字が多すぎるのです。 それで、入力文字を@data[$cont2][$cont3]の配列に入れて後から printすれば良いと思っていたのです。 こんな感じに・・・ print "入力してください->"; chomp($inp1 = <STDIN>); $cont1 = length($inp1); for ($i = 0;$i < $cont1;$i++) { $chr =substr($inp1,$i,1); $data[$cont2][$cont3] = $chr; #入力文字列の配列代入 $cont3 = $cont3+1; $chr =~ s/1/A/; $chr =~ s/2/B/; $chr =~ s/3/C/; ・ ・ ・ このように作って、配列に入っているようではあるのですが、結果の 出力方法がうまくできないのです。 考え方が悪いのでしょうか??  プログラムは全く異なってしまってもかまいません。 皆様の更なるご指導願います。

全文を見る
すると、全ての回答が全文表示されます。
  • ybnormal
  • ベストアンサー率50% (220/437)
回答No.1

#!/usr/bin/perl %x = ("1", "A", "2", "B", "3", "C"); foreach (@ARGV){ push (@z, $_); } $cnt = scalar(@z); $len = 2**$cnt; for($i=0;$i<$len;$i++){ @tmp = @z; @s = split(//, sprintf("%0${cnt}b", $i)); $c = 0; foreach (@s){ if($_ eq '1'){ $orig = $tmp[$c]; $tmp[$c] = $x{$orig}; } $c++; } print "@tmp\n"; } > ./foo 2 1 3 2 1 3 2 1 C 2 A 3 2 A C B 1 3 B 1 C B A 3 B A C > ./foo 1 2 3 1 2 3 1 2 C 1 B 3 1 B C A 2 3 A 2 C A B 3 A B C

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Perlでの文字列処理について

    プログラム初心者です。 Perlで下記のような文字列処理のプログラムの書き方がわからず、質問させて頂きました。 【内容】 FILE_A.txtが「!」マークで区切られていて、「!」マークの下行の文字列をIPアドレスの右横に移動したものをFILE_B.txtに出力するという処理です。 「!」マークの下行の文字列の「name」は共通です。 -------------------------------------------- 【FILE_A.txt】 ! name abcdeLV 123.123.123.123 123.123.123.124 123.123.123.125 ! name fghijLV 10.10.10.11 10.10.10.12 10.10.10.13 10.10.10.15 10.10.10.16 ! -------------------------------------------- ↓ -------------------------------------------- 【FILE_B.txt】 123.123.123.123 abcdeLV 123.123.123.124 abcdeLV 123.123.123.125 abcdeLV 10.10.10.11 fghijLV 10.10.10.12 fghijLV 10.10.10.13 10.10.10.15 fghijLV 10.10.10.16 fghijLV -------------------------------------------- 上記のようなPerlでの処理を具体的に教えて頂ければうれしいです。 本サイトのようなものを利用するのが初めてですので、不手際があるかもしれませんが なにとぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlでの文字列操作について

    Perlを使用しての文字列操作について教えてください。 たとえば以下のような数字とアルファベットが順に並ぶ文字列があるとします。 11A4C555D67B114B9423C アルファベットは1文字ですが、数字は何個でも連続で並びます。 この文字列を「数字アルファベット」の部分で分割し、配列に格納したいのですが、うまくいきません。 @array=('11A','4C','555D','67B','114B','9423C') どなたか教えてください。よろしくお願いいたします。

  • 文字列の置換で・・・

    Javaでの文字列の置換についてなんですが ある文字を任意の文字に置換し表示させるとともに 何個の文字を置換したかも同時に知らせたい場合は どのような処理をしたらよいでしょうか? ぜひご協力よろしくお願いします!! (例)入力した文字列に"a"が含まれる場合は"b"に置換し   その際に変換した文字数も表示してください。     basic→出力結果: "bbsic" 置換した文字数は1です。

    • ベストアンサー
    • Java
  • 任意の文字の組み合わせ

    Math::BaseCalc モジュールを使って 10 進数をアルファベットに変換すると、 $ perl -MMath::BaseCalc -le 'print Math::BaseCalc -> new(digits => ['A' .. 'Z']) -> to_base(26);' BA このように 26 -> BA になりますが、これが 26 -> AA となるようなモジュールはないのでしょうか? 0 (A) == 00 (AA) なので、基数変換ならば 26 -> BA で正しいのは分かります。 しかし、文字列的な変換方法を探しています。 別な言い方をすると、A-Z の組み合わせでできる文字列を順番に得たいと思っています。 すなわち、A, B, C, ..., Z, AA, AB, AC, ..., ZZ, AAA のような文字列です。 アルファベットならば範囲演算子 (..) を使って得られますが、任意の digits で同じような文字列を得ることができるようなモジュールはないのでしょうか? (例えば、0-9 A-Z a-z ならば 0, 1, 2, ..., 9, A, B, C, ..., Z, a, b, c, ..., z, 00, 01, 02, ...) 現在は拙作のサブルーチンを使っているのですが、もし定番のモジュールがありましたら、お教え頂きたいです。 ご回答よろしくお願い申し上げます。

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

    よろしくお願いします。 PLSQLで可変長のCSVファイルを読み込み、ある特殊文字があった場合、その 特殊文字が含まれている項目ごとNULLにし、またCSVファイルを出力する。 というプログラムを作りたいのですが、CSVファイルの読込み、書き出しのやり方 は判ったのですが、文字列置換がどうすればいいかわかりません。 またファイルはマルチレイアウトで、カラム数とも不定です。 例) 入力ファイル: A,B,C,D,ABCDEFG,FF,GG となっている場合、'E'という文字があるカラムはNULLで出力する というときに 出力ファイル: A,B,C,D,,FF,GG としたいのです。 ご教授下さい。

  • Perlでの文字列置換に関して

    Perlでの文字列置換についてうかがいます。 文字列中からHTMLタグを排除しようと思うのですが、 タグ部分のみをうまく指定することができず、困っています。 どうか御知恵をお貸し下さい。

    • ベストアンサー
    • Perl
  • 文字列の検索

    先日同じ質問をして、プログラムの内容を修正したのですが、今度は2つ文字列を入力した後0が無限にでてきます… どなたか解説・指摘・模範解答などおねがいします。 内容は最初にある文字列を入力して、その後別の文字列を入力して、 後に入力した文字列が最初に入力した文字列に含まれていれば1、 含まれていなければ0と表示するプログラムです。 (使用するのは#include<stdio.h>のみ、ポインタ変数必須です) #include<stdio.h> char *mystrfin(char *a, char *b); int main(void) { char *c,*d; char str1[100],str2[100]; printf("1>>"); fgets(str1,100,stdin); printf("2>>"); fgets(str2,100,stdin); *mystrfin(c,d); } char *mystrfin(char *a,char *b){ char *c,*d; while(c!='\0'){ c=a; d=b; while(c!='\0' && d!='\0'){ if(c!=d) printf("0"); break; c++; d++; } } if(d='\0') printf("1"); a++; return a; return NULL; } 例 検索対象文字列:asdfghjkl 検索文字列:sdf 1と出力 検索対象文字列:asdfghjkl 検索文字列:qwer 0と出力

  • ExcelVBAでの文字列置換について

    ExcelVBAでの文字列置換について ExcelVBAは全く初心者のですが、下記の処理を早急に行う必要があり、質問させていただきます。 物品の使用者をエクセル管理しています。 シート1のA列に物品名、B列に現使用者名を入力しています。(約2000件) 一部の使用者に変更があった場合に、シート2に振替リストを シート2 A列=現使用者 B列=新使用者 と作成しています。 シート1のB列:現使用者から、シート2のA列:現使用者と同一な文字列を検索し、シート2B列:新使用者に置換するマクロはどのように書けばよいのでしょうか? 可能であれば、シート2のC列に置換結果を表示させたいです。

  • perlで列の抜き出し

    a,b,c,d 1,2,3,4 5,6,7,8 以上のような配列のデータを読み込んだときに、 c 3 7 のように縦の列のデータを抜き出すプログラムを考えています。 これはどのように記述すればよいでしょうか。 二次元配列はperlでは不可能と言うことであまりperlでは難しいでしょうか。

  • Excel置換関数を用いて複数の文字列を置換したい

    上手く置換ができずに困っています。よろしくお願いします。 文字を入力した列の隣に、数値化する列を作成しようと思っています。 置換項目を6つ設定しようと思っているのですが、 A=4 B=3 C=2 D=1 E=0 F=0 の条件です。 =SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A2,"A","4"),"B","3"),"C","2"),"D","1"),"E","0"),"F","0") これではできませんでした...。 どなたか、わかる方がいらっしゃいましたら、ご教授願います。