質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

3回答

201閲覧

Perlの文書読み込み及びその内容の編集に関する質問です

perlstarter

総合スコア9

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

0クリップ

投稿2018/06/24 14:26

編集2018/06/25 06:47

前提

(助言を受け編集しました)
perlの超初心者です。初歩的な質問ですみません。読み込んだ文書をsortして、新しい文書に書き込みたいです。
具体的に:
"I am a student. I go to school."を
"a am go I I school. student. to" みたいな感じにしたいです。
しかし、現在は
"a am I student. go I school to." みたいになってます。どうすれば段落ごとではなく全文書を並べ替えられますか?

自分がやってみたのは以下の通りです。

発生している問題・エラーメッセージ

open(TEXT, "< 元の文書"); $new = "保存する場所"; open(NEW, "> $new"); foreach $line(<TEXT>){ @line = split(/ /,$line); @line = sort(@line); print NEW "@line"; } close (TEXT); close (NEW);

該当のソースコード

perl

エラー

保存する場所では段落ごと?行ごと?に並べ替えられています。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KojiDoi

2018/06/24 14:34

まずインデントをまともなものにしてください。
perlstarter

2018/06/24 15:02

すみません、初心者でまともなインデントがどのようなものであるべきかわからないのですが、わかりやすそうに空けてみました。
KojiDoi

2018/06/24 15:08

教科書を持っているなら見てください。こんなインデントをつけている例はないでしょう?
perlstarter

2018/06/24 15:21

こういうことでしょうか?
KojiDoi

2018/06/24 15:23

ダメ。ブロックの中は一律に字下げするんですよ。ほんとうに教科書観てますか?
perlstarter

2018/06/24 15:29

えと、これで合ってますか(汗) 教科書は持っていないので、先生のPPTを見て他のページで調べました(汗)
KojiDoi

2018/06/24 17:38

はい、そんな感じでOKです。うるさいこと言いやがってと思ったかもしれませんが、少し長いスクリプトを書き始めると、インデントがいい加減だと絶対にドツボにハマります。今のうちにきれいなコードを書く習慣をつけてください。
perlstarter

2018/06/25 06:47

いえいえ、わざわざ教えて頂きありがとうございます!
guest

回答3

0

ベストアンサー

× $new = "> 新しいファイル名と場所.txt"; ○ $new = "新しいファイル名と場所.txt";

並べ替えられるのは全文書ではなく段落ごと。

最初のループで、一行読んでは@lineを設定し直しているので、最後の段落しか残りませんね。

#追記
要件修正を踏まえて、”丸呑み”処理を加えます。 修正個所のみ示します。テストしていませんが多分うまく行く筈。

... foreach $line (<TEXT>){ push(@line, split(/ /,$line)); } print NEW join(" ", sort @line), "\n";

投稿2018/06/24 14:36

編集2018/06/25 07:14
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

perlstarter

2018/06/24 14:46

回答ありがとうございます。最初のループはどういう風に書けば良いのでしょうか...授業での説明ではあまり読み込みについて説明がなかったのでこれ全部でテキストの読み込みだと思っていました... 本当に初歩的な質問ですみません。
KojiDoi

2018/06/24 15:12

まずループを二つ作る必要がないですね。最初のループの中で、読んだらすぐにソートして出力するようにすればいいのです。
perlstarter

2018/06/25 06:51

ありがとうございます。いらない部分をを消して、書き換えてみました。エラーも出なくなり、文書が新しいファイルに書き込まれるようになったのですが、やはり段落ごとに並べ替えられています。段落ごとではなく全文書を通してならべかえるにはどうすべきでしょうか...?
KojiDoi

2018/06/25 07:04

要件を読み間違えていたようなので前のコメントは取り消します。 全文書通しての処理となれば、読込み専用のループを作ってデータを丸呑みする必要があります。
perlstarter

2018/06/25 12:33

うまくいきました!本当にありがとうございます!初心者レベルの質問から基礎まで本当に勉強になりました!ありがとうございました!
guest

0

Perlなど不要。そう、シェル芸ならね!

bash

1$ cat 場所とテキスト.txt|while read l;do echo $l|tr ' ' '\n'|sort|xargs;done > 新しいファイル名と場所.txt

投稿2018/06/24 14:50

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

angel_p_57

2018/06/24 14:59

いや、それなら次のperlワンライナーでしょう… $ perl -ple '$_=join" ",sort split' 場所とテキスト.txt > 新しいファイル名と場所.txt こっちでも良いかも $ perl -plae '$_=join" ",sort@F' 場所とテキスト.txt > 新しいファイル名と場所.txt
KojiDoi

2018/06/24 18:22 編集

個人的にはこの案件でシェルスクリプトはないなあ。最初はシェルで行けるかとやってみるが、やはりややこしくなってperlでやり直すパターンですね、私の場合は。 ちなみに、windows10上のcygwinのtimeコマンドで両方を測定してみたところ次の結果を得ました。 これはたまたま手元にあった10桁x100行のファイルを対象とした結果です。 シェル芸: real 0m15.232s user 0m1.957s sys 0m13.724s perl ワンライナー: real 0m0.075s user 0m0.031s sys 0m0.015s ついでに250桁x100行のファイルではこうなりました。 シェル芸: real 0m15.154s user 0m2.309s sys 0m13.641s perl ワンライナー: real 0m0.106s user 0m0.015s sys 0m0.030s
guest

0

$new = "> 新しいファイル名と場所.txt"; open(NEW, "> $new");

この時点で、openの引数で>が重複していて、ファイルハンドルNEWが想定通りの出力先になっていないと思います。

なお、そもそもの問題として2引数のopenは色々問題が起り易いので、今時はお勧めしません。3変数、かつ生のファイルハンドルを避けて、

open my $ifh, '<', 'inputfilename'; # 読み込み用にopen foreach my $line ( <$ifh> ) { … } open my $ofh, '>', 'outputfilename'; # 書き込み用にopen … print $ofh "$word\n";

のような使い方が良いです。( 或いはIO::Fileモジュールを使う方法もあります )

その問題とは別に、ファイルに出力する元となる@lineは、最初のループの最後の実行時に保存された内容、すなわち読み込んだファイルの最終行を分割・ソートした内容になっているのですが、それは意図通りなのでしょうか?

テキストの読み込み → 文章を単語ごとにsplit → アルファベット順に並べ替え → 新しいファイルに書き込む ということしたい

手順よりも先に、望む結果を明らかにした方が良いと思います。結果に至る手順は1通りではないですし、考えた結果が適切とも限りませんから。

投稿2018/06/24 14:49

angel_p_57

総合スコア1672

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

perlstarter

2018/06/24 14:57

回答ありがとうございます! ファイルの>については解決しました! @lineの部分ですが、意図したことは特にありません(泣) 望む結果は、読み込んだ文書を単語単位でアルファベット順にして新しいファイルに書き込むことです。 始めたばかりで初歩的な質問や問題ばかりですみません...
angel_p_57

2018/06/24 15:06

もうちょっと曖昧さをなくすように整理した方が良いかな、と。 入力ファイルを何かしら加工して新しいファイル書き込む、アルファベット順にするにしても、例えば、入力ファイルの各行と新しいファイルの各行は対応するんですか、とか。 アルファベット順にするのは全ファイルを通じてなのか、行の中だけなんですか、とか。 サンプルを1つ例示して貰った方が、多分スムーズに行きます。例えば、 ``` a c b e d f ``` という2行のファイルを入力とした場合、望む出力ファイルはどんなふうになっているんですか、と。 ``` a b c d e f ``` なのか ``` a b … ``` なのか、とか。
perlstarter

2018/06/24 15:22

全ファイルを通して...です!ありがとうございます。具体例を入れました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問