Schreiben Sie einen Code, um die Zeilennummer der Druck- / Ausgabeanweisung selbst auszugeben (in der Form „Hallo Welt, ab Zeile X!“).

25

Die Herausforderung

Schreiben Sie ein Programm , dass die Ergebnisse Hello World, from line X!, wo Xist die Zeilennummer, in der Quellcode der aktuellen Print - Anweisung selbst.

Die Regeln

  • In diesem Zusammenhang möchten wir, dass die erste Zeilennummer der Anweisung, die die Zeichenfolge ausgibt , angezeigt wirdstdout
  • Sie sollten es vermeiden, Ihren Quellcode einfach als Zeichenfolge (entweder Datei oder Quine) zu durchsuchen , um die Zeilennummer zu finden
  • Wenn dem Quellcode zusätzliche Leerzeichen oder Anweisungen hinzugefügt werden (die den Codefluss nicht unterbrechen), sollten diese zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren).

Empfehlungen

Wenn die Sprache dies vorgibt, können Sie Ausnahmen / Stack-Traces verwenden, um dieses Ziel zu erreichen. Versuchen Sie, Code zu verwenden, der auf verschiedenen Systemen / Implementierungen portierbar ist. Beachten Sie jedoch, dass dies keine Voraussetzung ist. Von der Verwendung definierter Variablen __LINE__wird abgeraten, obwohl dies nach den Regeln zulässig ist.

Der Gewinner

  • Dies ist ein Beliebtheitswettbewerb (beendet am 10. Juni 2014), bei dem die von der Community am höchsten gewählte Antwort auf der Grundlage der aktuellen Stimmen zum Gewinner erklärt wird

  • Berücksichtigen Sie beim Abstimmen bitte die Kreativität der Antwort, wie ausführlich oder interessant sie ist. und die Schwierigkeiten / Einschränkungen der verwendeten Programmiersprache

Durchbruch
quelle
Was meinst du mit "der ersten Zeilennummer"? Sprechen Sie darüber, was passieren soll, wenn die Anweisung mehrere Zeilen umfasst?
user2357112 unterstützt Monica
@ user2357112 Ja, nur um Unklarheiten zu beseitigen, wenn jemand eine Milti-Line-Anweisung verwenden muss.
Durchbruch
Der Titel ist sehr explizit, aber vielleicht ein bisschen lang.
Primo
1
Die Antworten darauf sind alle langweilig, weil es eine so schlechte Frage ist. Es ist, als hätte der Fragesteller nichts von der Existenz von LINE gewusst . Tatsächlich habe ich mich speziell angemeldet, um das abzustimmen. Ich fand es so schlimm.
Dave
1
@Markasoftware Wenn zuvor eine Zeile hinzugefügt wurde, ändert sich die Ausgabe nicht, um dies widerzuspiegeln.
Primo

Antworten:

48

Sinclair Basic

10 PRINT "Hello world, from line ";PEEK 23621;"!"

Hallo Welt, ab Zeile 10!

Dies funktioniert für jede Zeile unter PEEKder Adresse, in der die aktuelle Zeilennummer gespeichert ist. Daher funktioniert auch Folgendes:

341 PRINT "Hello world, from line ";PEEK 23621;"!"

Hallo Welt, ab Zeile 341!

kitcar2000
quelle
Und aus dem gleichen Grund, Timex / Sinclair BASIC!
Gabe
Ich gebe nicht vor, diese Sprache zu kennen, aber können Sie das nicht auslassen, STR$wenn Sie die +Zeichen durch Semikolons ersetzen ?
Mr Lister
@MrLister Ja, das würde definitiv funktionieren, aber ich benutze immer +s aus Gewohnheit.
kitcar2000
40

BASIC

Ich denke, das macht alles, was gefragt wurde:

10 PRINT "Hello World, from line 10!"
zimperliches Ossifrage
quelle
5
If any additional whitespace or statements (which do not interrupt the flow of the code) is added to the source code, it should be reflected at run-time (after compiling if applicable). Die Absicht ist da. Dies ist auch die erste Zeile der Quelle, nicht die zehnte.
Bill Woodger
30
Es ist vielleicht die erste Zeile im Quellcode, aber es ist immer noch Zeile 10 .
zimperlich ossifrage
13
Ich glaube, das fällt fest in die nicht mehr witzige Kategorie. Es ist wirklich einfallslos und uninteressant, obwohl es buchstäblich die Anforderung erfüllt. Warum hat das so viele positive Stimmen? (Ich habe downvoted)
Tim S.
18
Dies ist eine großartige Antwort, da es einen albernen, aber spezifischen Vorteil eines Aspekts der BASIC-Sprache ausnutzt, der in anderen Sprachen (insbesondere in modernen Sprachen) nicht häufig vorkommt. Es ist vielleicht nicht das beliebteste (die Zeit wird es zeigen), aber ich kann kaum erkennen, wie weniger interessant es ist, eine Konstante wie __LINE__ zu verwenden oder Debug-Informationen aus dem aktuellen Stack-Frame abzurufen (wie es die meisten anderen Antworten derzeit tun).
Nick
2
Clever, aber ich wäre enttäuscht, wenn nichts anderes mehr Gegenstimmen ergeben hätte als dieses.
Agweber
35

Java

public class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World, from line "+new Exception().getStackTrace()[0].getLineNumber()+"!");
    }
}
Baby
quelle
1
Ich würde es vorziehenThread.currentThread().getStackTrace()
Cruncher
3
Thread.getStackTrace () aufruft (new Exception ()) getStackTrace () , wenn auf dem aktuellen Thread aufgerufen, so dass es die gleiche Sache.
DHall
1
seltsam .... 2x gleiche Antwort und 2 verschiedene upvote Mengen ... (könnte als RNG Quelle verwendet werden ...) (hier gilt das gleiche: codegolf.stackexchange.com/a/30058/10801 )
masterX244
@ masterX244 Diese beiden Antworten sind nicht exakt identisch. In diesem Fall wird die getLineNumber()Methode für den Stack-Trace verwendet, während in der von Ihnen verknüpften Antwort toString()die Zeilennummer ermittelt wird.
Durchbruch
9
@ masterX244 Bemerkenswert ist auch, dass diese Antwort 2 Stunden zuvor erschien. Das zweite Mal, wenn ich eine Antwort sehe, ist sie nicht so interessant wie die erste.
Primo
30

Perl

close STDERR;
open FOOBAR,">",\$_;


print!warn,'Hello World, from line ',/(\d+)\.$/,'!';

Nicht ganz so kurz wie mit __LINE__, aber vielleicht interessanter.

warnist ein Debugging-Tool, das eine Anweisung ausgibt STDERR, die angibt, in welcher Datei und in welcher Zeile die Warnung ausgegeben wurde ... es sei denn, STDERR es wurde zuvor geschlossen oder auf andere Weise ist kein Zugriff möglich. In diesem Fall wird die Warnung für die zuletzt geöffnete Datei ausgegeben handle - das ist undokumentiertes Verhalten. Ich bin mir nicht sicher, ob es besser als Feature oder Fehler eingestuft wäre.

Hier STDERRwird geschlossen und ein neues Dateihandle als FOOBARgeöffnet identifiziert und an die Variable weitergeleitet $_. Dieses wird dann analysiert, um die Zeilennummer der Warnung abzurufen, die in die Druckanweisung eingebettet ist.

primo
quelle
3
Ja, es ist definitiv interessanter :)
Tal
27

C ++

#include <iostream>
#include <utility>
#include <type_traits>

#define __(A,B,C,...) B##C##A
#define _(A,...) __(__VA_ARGS__, A)
template<unsigned...Is> struct v;
template<unsigned I0, unsigned... Is> struct v<I0, Is...>:v<I0-1,I0-1, Is...> {};
template<unsigned...Is> struct v<0,Is...>:std::integral_constant<unsigned, sizeof...(Is)> {};

int main() {
  std::cout << "Hello world from line " << v<_(EXTRACT,_(Q,_,E,_,$$main$$,),_(@22,,_,_),_(Z,N,L,I,_,,L),__STACK_TRACE__)>::value << "\n";
}

Live-Beispiel

Yakk
quelle
2
Dies ist ... Zauberei
Paladine
1
Ich habe lange gebraucht, um zu sehen, wie das funktioniert. So viele rote Heringe! Es ist lecker.
Siehe
1
Wie funktioniert es?
0x499602D2
16

Lua

print("Hello world, from line "..debug.getinfo(1).currentline.."!")
mniip
quelle
16

C #

C # 5.0 [CallerLineNumber]macht den Trick:

using System;
using System.Linq;
using System.Runtime.CompilerServices;
namespace LineNumberConsole
{
    class Program
    {
        public static void Main()
        {
            Console.WriteLine("Hello World, from line {0}!", ToRoman(GetLineNumber()));
            Console.ReadLine();
        }

        private static int GetLineNumber([CallerLineNumber] int sourceLineNumber = 0)
        {
            return sourceLineNumber;
        }

        private static string ToRoman(int number)
        {
            // TODO: Copy some source code from http://pastebin.com/w0hm9n5W
            // Skipped here for brevity
            return number.ToString();
        }
    }
}

Ausgabe

Hello World, from line X!
Thomas Weller
quelle
Gibt es einen besonderen Grund, römische Ziffern zu verwenden?
Cole Johnson
4
Wenn die Druckzeile Zeile 10 ist, wird die Frage wörtlich interpretiert. Xin römischen Ziffern ist 10.
Urous
Römische Ziffern ist eine nette Geste!
NPSF3000,
15

C

#include <stdio.h>
main(){
printf("Hello World, from line %d!", __LINE__);
}
Knabberzeug
quelle
Es wird davon abgeraten, definierte Variablen wie LINE zu verwenden , obwohl dies nach den Regeln zulässig ist.
Vaxquis
@ Vaxquis, ja, aber meine Antwort geht der Bearbeitung der Frage
voraus
Es ist immer noch eine miese und zu offensichtliche Lösung, IMO. Ich frage mich, warum die Leute alle Arten von Variationen dieser Lösung in allen Sprachen der Welt (einschließlich PHP, D, Perl) veröffentlicht haben, anstatt überhaupt zu versuchen, etwas Komisches oder Faszinierendes zu tun?
Vaxquis
14

Python

Beispiel (10 Zeilen, 213 Zeichen):

import sys
import traceback
lineno = None
while True:
    try:
        print 'Hello World, from line %d!' % lineno
        break
    except:
        lineno = traceback.tb_lineno(sys.exc_info()[2])
        continue

Versuchen Sie es hier online . Code und Whitespace, die den Fluss nicht verändern, können hinzugefügt werden, und das Programm zeigt die aktualisierte Zeilenzahl an. Ebenso kann dieser Code-Snippet überall in einem vorhandenen Programm verwendet werden. Erwartete Ausgabe:

Hello World, from line 6!

Ein weiteres Beispiel (versuchen Sie es hier online), um zu zeigen, dass es funktioniert, wenn Code / Whitespace hinzugefügt wird. Erwartete Ausgabe:

Down we go...
Gotta catch 'em all.
Down we go...
Hello World, from line 11!
Awesome!
Durchbruch
quelle
12

Javascript

function getLine(n) {
   try {
      to
   } catch (dat) {
      var stack = dat.stack.split('\n');
       for (var i = 0; i < stack.length; i++) {
           if (~stack[i].indexOf ('getLine')) break;          
       }
      return dat.stack.split ('\n')[i + ~~n].match (/:(\d+)/)[1] - ~~window.hasOwnProperty ('__commandLineAPI')
   }
}
//Line 12
console.log ('Hello World, from line ' + getLine(1) + ' !')

Hinweis: Ausdrücke, die in der Chrome-Dev-Konsole ausgewertet werden, werden in eine withAnweisung eingeschlossen. Daher müssen wir die Zeile um eins dekrementieren, wenn dies der Fall ist

C5H8NNaO4
quelle
2
Dat Stack , hehe. Verifiziertes Arbeiten mit Firefox.
Durchbruch
1
@Breakthrough :) Ja, es funktioniert browserübergreifend (allerdings nur mit den neuesten Versionen von Chrome, FF und IE getestet). Chrome muss bei der Auswertung über die Konsole besonders behandelt werden, da jede Anweisung in eine withKlausel eingeschlossen wird.
C5H8NNaO4
2
Interessanter, aber nicht eindeutiger Benutzername. Vielleicht Mononatriumglutamat? (Übrigens denke ich darüber nach, eine Frage zu DNA und Aminosäuren zu stellen, von denen Glutaminsäure eine ist.)
Level River St
@steveverrill Laut Google sind Sie richtig !
kitcar2000
@ kitcar2000 Wahrscheinlich. Es gibt aber auch weniger bekannte Verbindungen mit dieser Formel: beispielsweise Natriummethylaspartat oder Nitropentanoat.
Level River St
11

Python 3

import hashlib
with open(__file__) as f:
    line_num = 0
    for line in f.readlines():
        line = line.rstrip() # make it work with or without newline at the end
        line_num += 1
        if hashlib.sha256(bytes(line, "UTF-8")).hexdigest()[0:6] == 'cc46f7':
            print('Hello world, from line {}!'.format(line_num)) # cc46f7

Hallo Welt, ab Zeile 8!

Dieser selbstlesende Code enthält einen selbstreferenzierenden Hash. Die SHA256-Summe der letzten Zeile (mit dem anfänglichen Leerzeichen und ohne nachfolgendes Leerzeichen) beginnt mit cc46f7... . Wenn es die printZeile hasht , stellt es fest, dass der Hash dem Zauberwert entspricht, nach dem es sucht.

Tim S.
quelle
Könnten Sie nicht einfach line_num = auf -1 setzen und den Ausdruck außerhalb der Schleife haben und den magischen Hash loswerden?
Dave
1
Ich bin mir nicht sicher, ob ich dir folge. Der magische Hasch macht diese Lösung clever.
Tim S.
+1 für die wörtliche Interpretation meiner Regeln :) Sehr klug.
Durchbruch
5
@Stefan Auf dieser Seite dreht sich alles um die schlimmsten Praktiken. ;)
Tim S.
1
@sehe Das lag höchstwahrscheinlich an Whitespace-Problemen. Ich hatte keine neue Zeile am Ende der Datei, als ich sie erstellt habe. Ich habe eine Zeile hinzugefügt, um vor dem Hashing Leerzeichen vom Zeilenende zu entfernen. Es sollte jetzt konsequenter funktionieren. (Stellen Sie auch sicher, dass Sie die Leerzeichen nicht in Tabulatoren konvertieren.) Ich habe versucht, es auf ideone hochzuladen, um Ihnen eine Live-Version anzuzeigen, aber es kann dort keine eigene Datei lesen.
Tim S.
9

GNU COBOL

Nun, sie sagten, dass es nicht möglich sei. Eigentlich war ich es, der sagte, dass es nicht geht. Jetzt ist es geschafft und eine veraltete Sprachfunktion wurde mit der angewendeten Methode neu implementiert.

Die Frage lautet:

Wenn dem Quellcode zusätzliche Leerzeichen oder Anweisungen hinzugefügt werden (die den Codefluss nicht unterbrechen), sollten sie zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren).

Jede Menge an Material kann vor den drei eingefügt DISPLAYs , die den Start der Ausgabe verursachen, und alles , was nach dem DISPLAYs würde „Unterbrechung der Strömung des Codes“, so dass das OK.

COBOL hatte früher ein TRACEVerb (Anweisung), das einfach die Quellzeilennummern auflistete, als sie ausgeführt wurden (kein Zugriff auf die Zeilennummer im Programm). Obwohl dies nur von begrenztem Nutzen ist, habe ich eine Implementierung von TRACE hinzugefügt.

   ID Division.
   Program-ID. HIWHERE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a b
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line "!"
       .
   End Declaratives
       .
   Main-Program Section.
       DISPLAY "Perform"
       Display "Hello World, from line " no advancing Perform b
       display "GO TO"
       Display "Hello World, from line " no advancing GO TO a
       .
   a.
       dISPLay "Fall through"
       Display "Hello World, from line " no advancing. b.
   The-Last-bit-OF-the-PROGRAM.
       GOBACK
       .

Die Ausgabe ist

Perform
Hello World, from line     18!
GO TO
Hello World, from line     20!
Fall through
Hello World, from line     23!

Als Beispiel für die Kraft und Flexibilität des Schreibens der Sprache werden in diesem Beispiel gemischte Groß- und Kleinbuchstaben gleichzeitig verwendet. Es spielt keine Rolle, wie bei der Verarbeitung alles in GROSSBUCHSTABEN "gefaltet" wird.

Der einzige Standard-COBOL-Weg, um eine Quell-Zeilennummer im laufenden Programm aus dem laufenden Programm zu erhalten, ist mit einem DEBUGGING DECLARATIVE. Innerhalb eines SECTION, ausschließlich innerhalb eines Absatzes innerhalb eines SECTION, eines solchen Deklarativs haben Sie Zugriff auf das Sonderregister DEBUG-LINE. Diese enthält die Quellzeilennummer des Verbs (Anweisung), das die Übertragung der Kontrolle auf einen bestimmten Prozedurnamen (Absatz oder SECTION) verursacht hat.

Also wird mit PERFORM, oder GO TOoder "durchfallen" der Absatz in den Debugging-Deklarativen SECTIONausgeführt.

OK, aber DISPLAYkeine Übertragung der Kontrolle.

Kein Problem. Stellen Sie es in die gleiche Zeile wie die Übertragung der Kontrolle.

Problem: Wenn "zusätzliche Leerzeichen oder Anweisungen (die den Code-Fluss nicht unterbrechen) zum Quellcode hinzugefügt werden, sollten sie zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren)".

Stellen Sie es also in dieselbe Zeile, aber vor einer Übertragung der Kontrolle, und teilen Sie den Inhalt von DISPLAYin zwei Teile. ) und geben Sie den ersten Teil vor der Übertragung der Kontrolle und den zweiten Teil aus dem aus DEBUG-LINE, sobald Sie sich in der Debug-Prozedur befinden.

Das letzte knifflige Bit ist für das "Durchfallen" ("Prozeduren" können PERFORMbearbeitet werden, können das Ziel von a sein GO TOoder können einfach eingegeben werden, indem die nächste Zeile entlang ist). Setzen Sie in diesem Fall das Zeichen DISPLAY in die Zeile, die die Prozedur definiert, jedoch vor die Definition .

Die Namen der "Prozeduren" ( aund b) wurden stark gekürzt, damit sie in dieselbe Quellzeile passen wie die DISPLAY. Streng genommen sollte ein COBOL-Prozedurname irgendwo zwischen Spalte 8 und Spalte 11 beginnen. Allerdings ist die Syntax heutzutage viel entspannter. Soweit ich einen Prozedurnamen in derselben Zeile wie Code definieren kann. Sogar in Code eingebettet. Pflege und gelegentliches Anhalten sind erforderlich.

Bei dem PROCEDURE DIVISIONjeweils gezeigten Punkt ist und sind keine weiteren erforderlich.

Kompilieren:

cobc -x -g hiwhere.cbl

So führen Sie (Linux) aus:

COB_SET_DEBUG=Y ./hiwhere

Zum Schluss die Rückgabe von TRACE (ohne READY / RESET).

   ID Division.
   Program-ID. tRacE.
   ENVIRONMENT DIVISION.
   configuration section.
          source-computer. TinkerToy with debugging mode.
   Procedure Division.
   Declaratives.
   Debug-Declaratives Section.
       Use For Debugging on a
       .
   Debug-Declaratives-Paragraph.
       Display Debug-Line
       .
   End Declaratives
       .
   Main-Program Section.
  *    Just append "perform a" to a single-line statement.
       DISPLAY "1" . perform a
       Display "2" . perform a
       display "3" . perform a
  *    Or prepend "perform a." for a multi-line statement, or a
  *    statement which won't "come back". 
       perform a. GOBACK
       .
   a.
       CONTINUE
       .

Ausgabe ist:

1
    17
2
    18
3
    19
    20

Wobei 1, 2 und 3 von den drei DISPLAY-Anweisungen ausgegeben werden und 17, 18, 19 und 20 die Zeilennummern der "ausführbaren" (nicht debuggenden) Zeilen sind.

Bill Woodger
quelle
8

Java

Verwenden des Verhaltens der Stapelablaufverfolgung von Exception, um die aktuelle Zeile abzurufen. Solange Printstatement nicht in mehrere Zeilen unterteilt ist oder die Klassendatei beschädigt wird, sollte es funktionieren

public class PrittLnbr
{
    public static void main(String[] args)
    {
        System.out.println("Hello World, from line "+new Error().getStackTrace()[0].toString().split(":")[1]+"!");
    }
}
masterX244
quelle
8

Python

import traceback, inspect
frame = inspect.currentframe()
print("Hello World, from line "+traceback.format_stack(frame)[0].split()[3][:-1]+"!")  
Hannes Karppila
quelle
6

Perl

print 'Hello World, from line '.__LINE__.'!';
Tal
quelle
13
Dies ist auch eine gültige PHP-Lösung.
MrLore
6

Java

public class HelloFrom {
    public static void main(String[] args) {
        System.out.println("Hello World, from line " + Thread.currentThread().getStackTrace()[1].getLineNumber() + "!");
    }
}
Cineris
quelle
technisch das gleiche wie ich ( codegolf.stackexchange.com/a/30058/10801 )
masterX244
2
Sortieren nach, außer dass der aktuelle Thread verwendet wird, anstatt einen neuen Fehler zu erstellen, um den Stack-Trace abzurufen. Es gibt keinen Fehler;)
Cineris
6

Python

import inspect
print ("Hello world from line %d!" % (inspect.getlineno(inspect.currentframe())))

Ausgabe

Hello World from line 2!
Ricardo A
quelle
1
Das beste Python, das es bisher gab!
kirbyfan64sos
6

Befunge

Nur zum Spaß gemacht.

>00g1+:00p"v"\10v  
    v-*45g00p\g <  
#v+1_$10g1vv,,,,<  
^<p000p01+<#>,,,^  
>" enil morf ,oll"v
@.,,,,,,,,,<^,"He"<

Bedingung: Oben links im Code muss 0 <x <20 und 0 <= y <62 sein; und die zwei ersten Zellen müssen leer sein.

Beispiel:

                         v                  

                         0                  
                         0                  
                         0                  
                         p                  
                         0                  
                         1                  
                         0                  
                         p                  
                         >00g1+:00p"v"\10v  
                             v-*45g00p\g <  
                         #v+1_$10g1vv,,,,<  
                         ^<p000p01+<#>,,,^  
                         >" enil morf ,oll"v
                         @.,,,,,,,,,<^,"He"<

Würde ausgeben:

Hallo, ab Zeile 10

AndoDaan
quelle
Keine Ahnung, was das war, aber ich glaube, Ihre Ausgabe behaupten, so +1 ;-)
ysap
1
Für diejenigen, die die Macht der mächtigen Befunge in Frage stellen, probieren Sie es hier aus: quirkster.com/iano/js/befunge.html
Justin
6

C

Mit einem variablen Makro können wir eine Druckfunktion erstellen, die die Zeilennummer automatisch an das Ende einer beliebigen printf-Anweisung anfügt und immer auf stdout druckt.

test.c:

#include <stdio.h>

#define printfl(format, ...) fprintf(stdout, format " From line %d\n", ##__VA_ARGS__, __LINE__)

int main() {
    printfl("Hello World! I have %d argument(s).", 1);
    return 0;
}

Ausgänge:

% ./test
Hello World! I have 1 argument(s). From line 6

Hinweis: Ich bin vom Muster abgewichen, um zu demonstrieren, dass printfl immer noch eine gültige Variadic-Funktion ist. Wenn Sie sich wirklich für das Format der Ausgabe interessieren, können Sie die von mir verwendeten Literale jederzeit ändern.

Walker Mills
quelle
Dies funktioniert nur, wenn Sie eine Zeichenfolge mit konstantem Format verwenden. Es schlägt fehl, wenn Sie einen anderen Ausdruck für die Formatzeichenfolge übergeben.
Snowbody
5

Bash

#
# some comments to fill some lines...
#
echo "Hello World, from line $LINENO!"

Ausgabe

Hello World, from line 4!
kitcar2000
quelle
@professorfish ... was stimmt nicht mit MEINEM Stil, um MEINE Antwort zu zeigen? Sie sollten zumindest erklären, warum Sie mein Kunstwerk manipulieren ... :-P
2
habe ich den Code geändert? Wenn ja, tut es mir leid. Ich hatte nur die Sorge, dass Nicht-Bash-Benutzer nicht in der Lage wären, den Quellcode und die Ausgabe zu ermitteln
1
Und jeder außer mir mag es zu sehen, wie seine Sachen geändert werden, ohne zu kommentieren, warum? Seltsamer Ort ...
3
Es war im Grunde eine Formatierungskorrektur. Es ist nichts wirklich falsch mit diesen AFAIK
Von der Verwendung definierter Variablen wie LINE wird abgeraten, obwohl dies nach den Regeln zulässig ist.
Vaxquis
5

D

void main ()
{
    import std.stdio;
    writefln("Hello World, from line %d", __LINE__);
}
Hugo Dubé
quelle
Von der Verwendung definierter Variablen wie LINE wird abgeraten, obwohl dies nach den Regeln zulässig ist.
Vaxquis
5

C oder C ++ und AWK

leineno.c:

// code or comments
// ....
#error Hello World, from line
// other code or comments

Verwendung:

gcc lineno.c 2>&1 | awk '{ split($0,a,":"); ; printf("%s %s!\n", gensub(".*#error ","",1), a[2]); exit; }'

Ausgabe:

Hallo Welt, von Zeile 3

Anmerkungen:

  • Kein vom Benutzer geschriebener Code durchsucht die Datei.
  • g ++ arbeitet mit einer C ++ - Datei.
Ken A
quelle
4

Irgendwie langweilig in Ruby:

puts "Hello World, from line #{__LINE__}!"

Das ist kein Betrug, oder?

Ajedi32
quelle
Nein, das ist kein Betrug! Diese Herausforderung wird offensichtlich in einigen Sprachen viel einfacher und in anderen schwieriger sein, weshalb ich sie gepostet habe :) (Ich verstehe jetzt, warum die Einbeziehung von Bewertungskriterien so wichtig ist)
Durchbruch
Von der Verwendung definierter Variablen wie LINE wird abgeraten, obwohl dies nach den Regeln zulässig ist.
Vaxquis
1
@vaxquis Ja, diese Aussage wurde nach dieser Antwort hinzugefügt .
Ajedi32
4

Javascript

Eine Zeile mit Stack-Trace.

(function (o) { console.log("Hello World, from line " + (Error.captureStackTrace(o) || o.stack.match(/\d+/)[0] - !!__commandLineAPI) + "!"); })({});
joelrobichaud
quelle
3

Kobra

class Program
    def main
        print 'Hello World, from line [System.Diagnostics.StackFrame(true).getFileLineNumber]!'
Οurous
quelle
3

Rubin

File.write "hello.rb", "x=2\n"+"x+=1\n"*rand(rand(100))+'puts "Hello World, from line #{x}!"'
system "ruby hello.rb"
File.delete "hello.rb"
ängstlich
quelle
3

Power Shell

Günstiger Umzug

Function LemmeGetDatError() {
    "Too busy chuggin along"
    "Then all of a sudden, I meet a new programmer"
    "And he's all like"
    Write-Output "$(Try {"Hello World from"; Throw "error" } Catch {$_.ScriptStackTrace.Split(":")[1]})"
}

LemmeGetDatError
SomeShinyMonica
quelle
3

Power Shell

$l=(Get-PSCallStack | ForEach{$_.Location})[0].split(' ')[-1]; "Hello World, from line $l!"

Und:

try{ I AM ERROR. } catch { $l=$error[0].InvocationInfo.ScriptLineNumber; "Hello World, from line $l!" }

Beide arbeiten so:

PS C:\MyFolder> .\helloworld.ps1
Hello World, from line 1!
DarkAjax
quelle
+1, Write-Hostschreibt aber nicht an stdout. Durch einfaches Übergeben der Zeichenfolge wird sie an stdout gesendet. ZB"Hello World, from line {0}!" -f (gcs| %{$_.ScriptLineNumber})[0]
Rynant
@ Rynant Guter Punkt! Ich werde meine Antworten aktualisieren, um dies zu berücksichtigen ...
DarkAjax
3

Python

import traceback

print 'Hello World, from line %i!' % traceback.extract_stack()[0][1]

Kurz und bündig.

Hoons
quelle
3

Perl

Ein anderes Perl:

use warnings;

$SIG{__WARN__} = sub { ($line = shift) =~ s/\D//g; };

$x=$x+1; print "Hello World, form line $line!\n";
DarkAjax
quelle