![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
たいへん困っています。Perlでプログラムを作成しており配列要素の削除を行なおうとしています。
例えば下のようなデーターをdata.txtファイルに保存しているとしてください。
1,洋服,婦人服,子供服,男性服,
2,時計,
3,アクセサリ,
上のデーターで1行目にある子供服を削除して
1,洋服,婦人服,男性服,
2,時計,
3,アクセサリ,
のようにずらしたいのです。
私がとった方法はデーターをopenで開きforeachで行をまず呼びこみます。
if(!open(DATA,"$data")){&error('ファイル読み取りエラー。'); }
else{
@data=<DATA>;
close(DATA);
}
foreach $line (@data){
chomp $line;
($no,@sub)=split(/,/,$line);
if($no eq 1){
$i=-1;
foreach (@sub){$i++;
if($sub[$i] eq '子供服'){next;}
else{push @newsub,"$sub[$i]";next; }
}
push @newline,"$no,@newsub\n";}
else{push @newcline,"$line\n";}
}
これで@newlineを表示すると
1,洋服,婦人服, 男性服,
2,時計,
3,アクセサリ,
のように男性の前の部分が半角空白として保存されます。
どうしてなのでしょうか?そもそもこういったやり方が間違っているのか、それとも一部だけまちがっているのかもわかりません。お手数ですがどなたか教えてください。
No.1ベストアンサー
- 回答日時:
簡単なことを複雑にやっている印象があります。
本当は、bakusuiさんにとって良くないことだと思いますが、私だったら、こうするという例を示します。$datfile = @ARGV[0];
open(DATA, $datfile) || die "can't open $datfile\n";
while($line = <DATA>){
($num, @items) = split(/,/, $line);
if($num == 1){
$line =~ s/子供服\s*,//g;
}
print $line;
}
No.4
- 回答日時:
>1行をforeachで探し出してpushで振り分けるようにしていました。
残したいデータもしくは削除したいデータを振り分けて個別に後で処理したいのなら、そうすべきでしょう。単にファイルに書き分けるだけなら、配列に入れずに、そのままファイルに書き出せばよいのではないでしょうか。
>あと、$line =~ s/子供服\s*,//g; の\s*は必要なのでしょうか?
もちろん、なくても構いません。単にデータ中に余計なスペースがあった場合の予防です。自分で作成したデータと言えど信用しません(余計なスペースがどこに入っているか分からないですから)。
以下のように、まず最初に余分なスペースを消去した方がいいですね。
$line =~ s/[ \t]+//g; #余計なスペース、タブの消去
$line =~ s/子供服,//g;
No.3
- 回答日時:
#1さんが言っておられる通り、複雑なことをやりすぎている気がします。
(文字列の置換で十分対応できる。)どうしても、配列の要素から特定の条件に当てはまるものを削除したいというのであれば、grep等を使うのが一番スマートな気がします。
今の場合であれば、
@sub = grep { $_ ne '子供服' } @sub;
等は、いかがでしょうか?
No.2
- 回答日時:
補足します。
> 簡単なことを複雑にやっている印象があります。
文字列のレベルで処理できることに対して、わざわざ配列を使っているという意味です。文字列のレベルで処理できることは、文字列の置換や消去で行った方が良いでしょう(プログラムが簡単)。
今回の質問の例では、わざわざ配列に入れ直す必要もないと思います。もちろん、処理内容(例えば、行内の項目をソートしたりする場合)によっては、配列に入れ直した方が良いでしょう。
結論からいいますと、うまくいきました。
感動しました。一度頭の中で配列を使うと思いこんでしまうとそればっかりしてました。
たいへん感謝いたします。
いままでの傾向(私自身的に)では例えば掲示板のかきこみなどを削除をするとき1行をforeachで探し出して
pushで振り分けるようにしていました。1行まるごと削除する場合はこれでいいのですよね?
文字列レベルの時おっしゃっていたようにすればいいんでしょうか?
あと、$line =~ s/子供服\s*,//g;
の\s*は必要なのでしょうか?
これを付加しなくてもうまくいってるような気がするのですが・・・\s\は0個以上空白文字ですよね?あったほうがいいのですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 2 2022/06/25 22:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アルファベットに付いて質問し...
-
Perlのエラーについてご教授く...
-
テキストファイルで提出とは?
-
perlプログラミング 空白行削除
-
perlをバージョンアップしたら...
-
perl 正規表現でエラー
-
LinuxにおいてのPerlのプログラ...
-
Perlの質問:行と列を入れ替え...
-
Strawberry Perl for Windows ...
-
ターミナルで特定の文字と文字...
-
Perlの全角スペース 文字化け?
-
Perlで時間の計算
-
openした後、closeしないでプロ...
-
これをビジュアルスタジオで実...
-
【超初心者】異なるディレクト...
-
ファイルをディレクトリ分配の...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
どのようなプログラムをつくれ...
-
csvで順番の入れ替え
-
perlでの三次元配列の作り方
-
配列の中に重複文字列があるか...
-
要素を削除する最適な方法
-
perlで複数行のデータを自由に...
-
pushをすると行ができる
-
ファイルから読み込んで配列へ
-
Perlの初歩的な質問・・・
-
行・列の整理! perl
-
C言語のバイナリモードでのfsca...
-
perl-cgi 文字の長さでソートし...
-
C言語でバイナリファイルの読み...
-
Pythonの再帰関数の動作の流れ...
-
CSVデータ「","」と「,」混在読...
-
perlで読み込んだURLを配列に入...
-
perlの無名配列の使い方を教え...
-
ソートのテクニックについて
-
ランダムでかぶらないように4...
-
頻度表の作成(Perl初心者です)
おすすめ情報